ReactPHP libevent 和 socket_pair 抛出错误
Posted
技术标签:
【中文标题】ReactPHP libevent 和 socket_pair 抛出错误【英文标题】:ReactPHP libevent and socket_pair throws error 【发布时间】:2015-11-16 12:22:47 【问题描述】:我有一个问题,然后我将 Reactphp 事件循环与 stream_socket_pair 一起使用。
使用 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】:与socket_pair无关,与进程分叉有关。 LibEvent 声明:
一些事件机制不能跨叉生存。 event_base 需要用这个函数(event_base_reinit)重新初始化。
在 fork 之后添加“event_base_reinit”后一切正常
【讨论】:
以上是关于ReactPHP libevent 和 socket_pair 抛出错误的主要内容,如果未能解决你的问题,请参考以下文章