2011-04-19 29 views
6

我能夠用libevent製作一個簡單的php websocket服務器,但是當我嘗試使其進行多處理時,卡住了。與libevent的多進程php

例如,這是一個處理

<?php 
$socket = stream_socket_server ('tcp://0.0.0.0:2000', $errno, $errstr); 
stream_set_blocking($socket, 0); 
$base = event_base_new(); 
$event = event_new(); 
event_set($event, $socket, EV_READ | EV_PERSIST, 'ev_accept', $base); 
event_base_set($event, $base); 
event_add($event); 
event_base_loop($base); 

$GLOBALS['connections'] = array(); 
$GLOBALS['buffers'] = array(); 

function ev_accept($socket, $flag, $base) { 
    static $id = 0; 

    $connection = stream_socket_accept($socket); 
    stream_set_blocking($connection, 0); 

    $id += 1; 

    $buffer = event_buffer_new($connection, 'ev_read', NULL, 'ev_error', $id); 
    event_buffer_base_set($buffer, $base); 
    event_buffer_timeout_set($buffer, 30, 30); 
    event_buffer_watermark_set($buffer, EV_READ, 0, 0xffffff); 
    event_buffer_priority_set($buffer, 10); 
    event_buffer_enable($buffer, EV_READ | EV_PERSIST); 

    // we need to save both buffer and connection outside 
    $GLOBALS['connections'][$id] = $connection; 
    $GLOBALS['buffers'][$id] = $buffer; 
} 

function ev_error($buffer, $error, $id) { 
    event_buffer_disable($GLOBALS['buffers'][$id], EV_READ | EV_WRITE); 
    event_buffer_free($GLOBALS['buffers'][$id]); 
    fclose($GLOBALS['connections'][$id]); 
    unset($GLOBALS['buffers'][$id], $GLOBALS['connections'][$id]); 
} 

function ev_read($buffer, $id) { 
    while ($read = event_buffer_read($buffer, 256)) { 
     var_dump($read); 
    } 
} 
?> 

但是,當我做到這一點的功能EV_READ

 function ev_read($buffer, $id) { 
      while ($read = event_buffer_read($buffer, 256)) { 
    $pid = pcntl_fork(); 
     switch ($pid) { 
     case -1: // Error 
      die('Fork failed, your system is b0rked!'); 
      break; 
     case 0: // Child 
       event_buffer_write($buffer,"asdawdasd"); 

     exit(0); 
      break; 


      } 
    } } 

它不發送數據...

那麼,怎樣才能使一個多處理php socket服務器?

+0

爲什麼要分叉新的進程?如果您使用libevent,那麼爲什麼不嘗試異步「多處理」方法? – Robin 2011-04-19 18:40:05

+0

該怎麼做? – Deadworldisee 2011-04-19 18:41:05

+0

給我一些提示,如何使它在PHP中... – Deadworldisee 2011-04-19 18:43:31

回答

5

雖然nanoserv是一個很好的庫,但它不使用libevent。事實上,作者本人在他的博客中寫道,他希望在某個時間點將nanoserv轉換爲使用libevent。在這裏看到他的博客文章:http://blog.si.kz/index.php/2010/02/03/libevent-for-php

還有一個評論由阿利克斯阿克塞爾在11年5月22日12:19關於同樣的。

更新:多一點研究導致我http://phpdaemon.net/。看來他們正在使用libevent構建一整臺網絡服務器

+0

https://github.com/kakserpom/phpdaemon/blob/master/lib/Thread .php – Xeoncross 2013-01-07 18:50:34

+0

phpdaemon.net似乎已經死亡。網站顯示域名正在出售。 – Berniev 2015-11-10 23:59:16

+0

kasperpom鏈接也死了(404)。 – Berniev 2015-11-11 00:00:56