2011-04-19 19 views
6

Basit bir php websocket sunucusunu benimle yapabilirim, ancak çoklu işlem yapmayı denediğimde takılıyorum.Çok işlemli php libevent ile

örneğin

Bu yüzden bir nasıl yapabilir ... Bu tek işlem

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

olduğu Ama işlevinde bunu yaparken

 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; 


      } 
    } } 

o veri göndermek doesnt ev_read çok işlemli php soket sunucusu?

+0

Niçin yeni süreçler engellemek istiyorsun? Eğer libevent kullanıyorsanız, neden asenkronize "çoklu işlem" yaklaşımını denemiyorsunuz? – Robin

+0

bunu nasıl yapıyor? – Deadworldisee

+0

Bana bazı ipuçlarını ver, php içinde nasıl yapılacağı ... – Deadworldisee

cevap

5

Nanoserv mükemmel bir kütüphane olsa da, libevent kullanmaz. Yazarın kendisi, blogunda, bir noktada liberant kullanmak için nanoserv'i dönüştürmek istediğini yazar. Onun blog yazısına bakın: http://blog.si.kz/index.php/2010/02/03/libevent-for-php

Ayrıca Alix Axel tarafından 22 Mayıs'ta saat 12: 19'da bir yorum da var.

Güncelleme: Biraz daha fazla araştırma beni http://phpdaemon.net/'a yönlendirdi. Ağ sunucularının bir listesini oluşturmak için çok kullanışlıdır.

+0

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

+0

phpdaemon.net öldü gibi görünüyor. Site alanı etki alanı satılıktır. – Berniev

+0

kasperpom bağlantısı da öldü (404). – Berniev

İlgili konular