我一直在对 ReactPHP 进行一些测试,因为它看起来非常棒。对于一个简单的套接字服务器,我已经使用以下react/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();
});
Wow, some data, such cool
在这种情况下,有 10 个客户端,客户端将在所有客户端处理后显示文本(大约 2 秒),但服务器New client !
无需等待即可显示。
所以这里我缺乏理解,ReactPHP 是异步 I/O,但是 PHP 是单线程的,如果输入输出之间有很多处理,就会阻塞所有客户端。