我一直在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();
});

在这种情况下,如果有10个客户端,则在所有客户端处理(大约2秒)后,客户端将显示文本Wow, some data, such cool,但是服务器将显示New client !而无需等待。

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

最佳答案



是的。

ReactPHP非常受node.js的启发,它遵循相同的原理。这种基于事件的模式的目标不是利用服务器的16个CPU,而是通过处理HTTP请求B来充分利用处理器,而对数据库A发出请求的请求A的 Controller 则被暂停,直到“数据库请求成功”为止。 '事件被调用。

您的测试与node.js和ReactPHP所做的假设完全相反:“计算速度快,I/O速度慢”,因此,如果我们在I/O期间(而不是在I/O之间)进行计算,那么CPU时间将总是可以提供比所需数量更多的数量。

如果要使用服务器16 CPU,则使用no​​de.js或ReactPHP,只需在16端口上启动16服务器进程,然后在它们前面放置一个负载平衡器(如nginx)即可。

但是请记住,ReactPHP仍处于试验阶段,尚未准备好投入生产。

关于php - ReactPHP确实是异步的吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22502118/

10-10 22:04