2011-04-19 37 views
6

Puedo crear un servidor websocket simple con libevent, pero estoy atascado cuando trato de hacerlo multiprocesamiento.PHP multiproceso con libevent

por ejemplo, esto es solo el procesamiento

<?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); 
    } 
} 
?> 

Pero cuando hago esto en función de 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; 


      } 
    } } 

es imposible enviar los datos ...

Entonces, ¿cómo puedo hacer una multiprocesamiento servidor de socket php?

+0

¿Por qué quieres crear nuevos procesos? Si está utilizando libevent, ¿por qué no probar un enfoque asincrónico de "multiprocesamiento"? – Robin

+0

cómo hacerlo? – Deadworldisee

+0

Dame algunos consejos, cómo hacer eso en php ... – Deadworldisee

Respuesta

5

Mientras nanoserv es una excelente biblioteca, no utiliza libevent. De hecho, el propio autor ha escrito, en su blog, que le gustaría convertir nanoserv para usar libevent en algún momento. Ver su publicación en el blog aquí: http://blog.si.kz/index.php/2010/02/03/libevent-for-php

También hay un comentario de Alix Axel el 22 de mayo a las 12:19 con respecto a la misma.

Actualización: Un poco más de investigación me llevó a http://phpdaemon.net/. Parece que están utilizando libevent para construir una gran cantidad de servidores de red.

+0

https://github.com/kakserpom/phpdaemon/blob/master/lib/Thread .php – Xeoncross

+0

phpdaemon.net parece haber muerto. El sitio muestra que el dominio está a la venta. – Berniev

+0

el enlace kasperpom está muerto también (404). – Berniev