棘轮事件循环被阻止

时间:2016-08-08 08:30:11

标签: websocket ratchet reactphp

我使用棘轮php创建一个Web套接字连接。我连接了一个客户端然后执行了一个查询(执行查询需要大约20秒),同时我尝试连接另一个客户端,我看到Web套接字连接处于挂起状态(仍在尝试切换协议) 。稍后当初始请求响应时,我看到服务器打印'建立新连接'(将此语句保留在我的onOpen函数中)。

如果反应php的工作原理和NodeJ相同,那么即使处理需要很多时间,也不应该建立连接吗?

为什么Web套接字连接因后续执行部分而被阻止?

1 个答案:

答案 0 :(得分:0)

嗯,这不完全准确。棘轮PHP和NodeJS不是豆荚中的豌豆。它们并不完全相同。

Ratchet PHP所做的是利用非阻塞I / O流。这是从建立到WS服务器的TCP / IP连接到框架促成的任何其他IO连接的所有内容。

但是,你认为你正在运行一个查询,我假设它是一个数据库查询?如果您自己建立了与此数据库的连接而不是通过Ratchet的非阻塞IO流设施建立连接,则数据库查询将通过阻塞的TCP / UNIX套接字进行。这意味着,PHP 必须坐在那里等待你的dbms响应查询,然后才能继续执行更多的代码。因此,同时您的WebSocket服务器无法响应任何其他请求,接受任何其他连接,甚至运行另一行代码,直到该数据库系统响应,因为TCP套接字处于WAIT状态。它只是坐在那里等待数据流入管道。