使用libevent的多进程php


Multi-process php with libevent

我能够使用libevent制作一个简单的php websocket服务器,但是当我试图使其多处理时,我被卡住了。

例如,这是单处理

<?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套接字服务器?

虽然nanoserv是一个优秀的库,但它不使用libevent。事实上,作者本人在他的博客中写道,他希望在某个时候将nanoserv转换为使用libevent。请看他的博客:http://blog.si.kz/index.php/2010/02/03/libevent-for-php

Alix Axel在2011年5月22日12:19也有一个关于同样的评论。

更新:更多的研究使我找到了http://phpdaemon.net/。似乎他们正在使用libevent来构建整个网络服务器主机

2021年5月30日更新:最近有https://www.swoole.co.uk/&https://reactphp.org/为套接字提供了很好的异步库。

phpdaemon有一个新的url在https://daemon.io/

2022年8月31日更新:Swoole现在分为两个独立的项目:Open Swoole &;Swoole