Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Multi-process php with libevent

I am able to make a simple php websocket server with libevent , but I am stuck when I'm trying to make it multiprocessing.

for example this is single processing

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

But when I do this in function 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;


            }
   } }

it doesnt send the data...

So how can I make a multiprocessing php socket server?

like image 975
Deadworldisee Avatar asked Apr 19 '11 18:04

Deadworldisee


1 Answers

While nanoserv is an excellent library, it does not use libevent. Infact the author himself has written, in his blog, that he would like to convert nanoserv to use libevent at some point of time. See his blog post here: http://blog.si.kz/index.php/2010/02/03/libevent-for-php

There is also a comment by Alix Axel on May 22 '11 at 12:19 regarding the same.

Update: A little more research led me to http://phpdaemon.net/ . It seems they are using libevent to build a whole host of network servers

Updated 30th May 2021: Recently there has been https://www.swoole.co.uk/ & https://reactphp.org/ which provide good async libraries for sockets.

phpdaemon has a new url at https://daemon.io/

like image 116
Amitabh Kant Avatar answered Sep 28 '22 00:09

Amitabh Kant