ReactPHP 真的是异步的吗?

2022-08-30 12:56:33

我一直在ReactPHP上做一些测试,因为它看起来非常棒。我已经使用以下 react/套接字代码对它进行了测试,用于简单的套接字服务器。

$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 !

但是我做了一个新的测试,对事件进行了更多的处理。为了说明我的话,我将添加一个循环,该循环需要几毫秒才能完成:datafor

$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 coolNew client !

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


答案 1

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这样的负载均衡器。

但请记住,ReactPHP仍然是实验性的,还没有准备好投入生产。


答案 2

推荐