ReactPHP libevent和socket_pair抛出错误

时间:2015-11-16 12:22:47

标签: php libevent reactphp

我遇到问题然后我使用带有stream_socket_pair的ReactPHP事件循环。

使用StreamSelect循环它完美地运行但是我尝试将它与LibEvent扩展一起使用我得到了无限的错误流:

[warn] kevent: Bad file descriptor

重现此错误的最小代码

<?php

require_once __DIR__ . '/vendor/autoload.php';

$loop = React\EventLoop\Factory::create();

$sockets = stream_socket_pair(STREAM_PF_UNIX, STREAM_SOCK_STREAM, STREAM_IPPROTO_IP);

$pid = pcntl_fork();
if ($pid > 0) {
    fclose($sockets[1]);

    $loop->addReadStream($sockets[0], function ($socket) {
        $data = fread($socket, 100000);
        echo '[' . posix_getpid() . '] Master: ' . $data . PHP_EOL;
    });

    $loop->addTimer(1, function () use ($sockets) {
        fwrite($sockets[0], 'Hello slave!');
    });

    $loop->run();


} else {
    fclose($sockets[0]);

    $loop->addReadStream($sockets[1], function ($socket) {
        $data = fread($socket, 100000);

        echo '[' . posix_getpid() . '] Slave: ' . $data . PHP_EOL;
    });

    $loop->addTimer(1, function () use ($sockets) {
        fwrite($sockets[1], 'Hello master!');
    });

    $loop->run();
    exit();
}

pcntl_wait($status);

1 个答案:

答案 0 :(得分:1)

它与socket_pair无关,但与进程分叉无关。 LibEvent表示:

  

某些事件机制无法在fork中生存。需要使用此函数重新初始化event_base(event_base_reinit)。

添加&#34; event_base_reinit&#34;在fork之后一切正常