1

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

如果 react php 的工作原理与 NodeJs 相同,那么即使处理需要大量时间,是否不应该建立连接?

为什么 web socket 连接因为后面的执行部分而被阻塞?

4

1 回答 1

0

嗯,这并不完全准确。Ratchet PHP 和 NodeJS 不是豆荚里的豌豆。它们的工作方式并不完全相同。

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

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

于 2016-08-23T01:16:09.923 回答