37

我一直在对 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 是单线程的,如果输入输出之间有很多处理,就会阻塞所有客户端。

4

1 回答 1

56

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 仍处于试验阶段,尚未准备好投入生产。

于 2014-06-05T18:39:19.320 回答