首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ReactPHP真的是异步的吗?

ReactPHP真的是异步的吗?
EN

Stack Overflow用户
提问于 2014-03-19 09:58:42
回答 1查看 22.1K关注 0票数 37

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

代码语言:javascript
复制
$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循环,它需要几毫秒才能完成:

代码语言:javascript
复制
$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 (so~2秒)的客户端之后显示文本,而服务器将不等待地显示New client !

所以在这里我缺乏理解,ReactPHP是一个异步I/O,但是ReactPHP是ReactPHP,如果输入和输出之间有大量的处理,就会阻塞所有客户端。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-05 18:39:19

ReactPHP是一个异步I/O,但是PHP是单线程的,如果输入和输出之间有大量的处理,就会阻塞所有客户端。

是。

ReactPHP很大程度上受到了node.js的启发,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仍然是实验性的,还没有准备好投入生产。

票数 56
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22502118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档