php - ReactPHP 真的是异步的吗?

标签 php sockets asynchronous reactphp

我一直在对 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 is an asynchronous I/O, but PHP is single-threaded, and if there is a lot of processing between input and output, that will block all clients.

是的。

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

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

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

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

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

相关文章:

php - Laravel 自定义路由模型绑定(bind)

java - 如何使用 Java 发送 ISO8583 消息

c - 如何在一个进程中进行 TLS 握手并在另一个进程中处理其余连接?

java - 如何在 Java 7 中为 RMI 配置自定义客户端套接字工厂?

javascript - Protractor 适合规范 DRY

php - MySQL -> PHP Array -> Json 需要以数组加对象格式输出

php - 使用 mysqli 的 Bind_param 非对象错误

php - laravel 应用中调用 index.php 报错 500(Windows 环境)

php - PHP 可以异步使用套接字吗?

java - 如何在java中创建一个接受回调函数的方法?