我最近在测试ReactPHP,因为它看起来非常棒。我已经使用以下react/socket的代码进行了测试,用于创建一个简单的Socket服务器。
$loop = React\EventLoop\Factory::create();
$socket = new React\Socket\Server($loop);
$socket->on('connection', function ($conn) {
echo 'New client !';
$conn->on('data', function ($data) use ($conn) {
$conn->write("Wow, some data, such cool\n");
$conn->close();
});
});
$socket->listen(1337);
$loop->run();
到目前为止还没有问题。当一个客户端连接时,服务器会显示New client !
并且客户端会接收到响应。
但我进行了一项新的测试,在data
事件上进行更多的处理。为了说明我的话,我将添加一个for
循环,需要几毫秒才能完成:
$conn->on('data', function ($data) use ($conn) {
$conn->write("Wow, some data, such cool\n");
for ($i=0; $i<10000000; $i++); // here
$conn->close();
});
在这种情况下,有10个客户端,当所有客户端处理完毕(大约2秒)后,客户端将显示文本Wow, some data, such cool
,但服务器将立即显示New client !
,无需等待。
所以这里我的理解不够,ReactPHP是一个异步I/O库,但是PHP是单线程的,如果在输入和输出之间存在大量处理,那么会阻塞所有客户端。
stream_socket_server
进行封装的,就我所知。问题是stream_socket_server
是否是异步的。考虑到 PHP 的基本架构,这让我感到惊讶,但我不知道确切的答案。 - deceze