ReactPHP 真的是异步的吗?
Posted
技术标签:
【中文标题】ReactPHP 真的是异步的吗?【英文标题】:Is ReactPHP truly asynchronous? 【发布时间】:2014-04-25 11:26:50 【问题描述】:我一直在对 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是单线程的,如果输入输出之间有很多处理,就会阻塞所有客户端.
【问题讨论】:
***.com/a/15501449/1073758 我不是在问 PHP 是否可以做多线程,我在另一个项目中使用github.com/krakjoe/pthreads,但是,简而言之,如果我已经达到了这个库的限制。 据我所知,该库基本上是stream_socket_server
的包装器。问题是stream_socket_server
是否是异步的。鉴于 PHP 的基本架构会让我感到惊讶,但我不知道确切的答案。
您可以使用stream_set_blocking(stream, true or false)设置非阻塞套接字服务器
当然,但是:"这会影响从流中读取的 fgets() 和 fread() 等调用。在非阻塞模式下,fgets() 调用总是会立即返回阻塞模式,它将等待数据在流上可用。” - 这没有说明异步处理......
【参考方案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 仍处于试验阶段,尚未准备好投入生产。
【讨论】:
Kraken 或 Swoole 怎么样?这些也是实验性的吗?它们与 amphp 有何不同? 您应该观看此视频并自行决定。 v=fQxxm4vD8Ok以上是关于ReactPHP 真的是异步的吗?的主要内容,如果未能解决你的问题,请参考以下文章
ReactPHP libevent 和 socket_pair 抛出错误