ReactPHP真的是异步的吗?



我一直在对ReactPHP做一些测试,因为它看起来非常棒。我用下面的react/socket代码测试了它,用于一个简单的socket服务器。

$loop = ReactEventLoopFactory::create();
$socket = new ReactSocketServer($loop);
$socket->on('connection', function ($conn) {
    echo 'New client !';
    $conn->on('data', function ($data) use ($conn) {
        $conn->write("Wow, some data, such cooln");
        $conn->close();
    });
});
$socket->listen(1337);
$loop->run();

在此之前没有任何问题。当客户端连接并收到响应时,服务器显示New client !

但是我做了一个新的测试,对data事件进行了更多的处理。为了说明我的话,我将添加一个for循环,它将花费几毫秒来完成:
$conn->on('data', function ($data) use ($conn) {
    $conn->write("Wow, some data, such cooln");
    for ($i=0; $i<10000000; $i++); // here
    $conn->close();
});

在这种情况下,有10个客户端,在所有客户端处理完(所以~2秒)后,客户端将显示文本Wow, some data, such cool,但服务器将显示New client !而不等待。

所以这里我缺乏理解,ReactPHP是异步I/O,但PHP是单线程,如果在输入和输出之间有很多处理,那将阻塞所有客户端。

ReactPHP是异步I/O,但是PHP是单线程的,如果在输入和输出之间有很多处理,那将阻塞所有客户端。

是的。

ReactPHP很大程度上受到node.js的启发,它们遵循同样的原则。这种基于事件的模式的目标不是利用服务器的16个CPU,而是通过处理HTTP请求B来充分利用处理器,而请求A的控制器已经向数据库发出请求,暂停直到调用'数据库请求成功'事件。

你的测试完全违背了node.js和ReactPHP的假设:"计算很快,I/O很慢",所以如果我们在I/O期间(而不是在I/O之间)进行计算,那么CPU时间将总是比需要的更多。

使用node.js或ReactPHP,如果你想使用你的服务器16个CPU,你只需要在16个端口上启动16个服务器进程,并在它们前面放置一个负载均衡器,如nginx。

最新更新