我一直在对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是单线程,如果输入和输出之间有很多处理,那将阻止所有客户端
答案 0 :(得分:50)
ReactPHP是一个异步I / O,但PHP是单线程的,如果输入和输出之间有很多处理,那将阻止所有客户端。
是
ReactPHP受node.js的启发,遵循相同的原则。这种基于事件的模式的目标不是利用您的服务器16 CPU,而是通过处理HTTP请求B来充分利用您的处理器,而请求A的控制器(已向数据库发出请求)暂停,直到'数据库请求成功'事件被召唤。
你的测试完全违背了node.js和ReactPHP的假设:“计算速度很快,I / O很慢”,所以如果我们在I / O期间进行计算(而不是在I / O之间),那么CPU时间总是比所需数量更多。
如果要使用服务器16 CPU,使用node.js或ReactPHP,只需在16端口上启动16服务器进程,并在其前面放置nginx等负载均衡器。
但请记住,ReactPHP仍然是实验性的,还没有为生产做好准备。