当前位置:  开发笔记 > 编程语言 > 正文

ReactPHP真的是异步的吗?

如何解决《ReactPHP真的是异步的吗?》经验,为你挑选了1个好方法。

我一直在对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个客户端,客户端将Wow, some data, such cool在所有客户端处理后显示文本(所以~2秒),但服务器将显示New client !而不等待.

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



1> jillro..:

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仍然是实验性的,还没有为生产做好准备.


Kraken或Swoole怎么样?那些也是实验性的吗?它们与amphp有什么不同?
推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有