PHP中没有守护程序的WebSocket服务器?

Posted

技术标签:

【中文标题】PHP中没有守护程序的WebSocket服务器?【英文标题】:WebSocket server in PHP without daemons? 【发布时间】:2012-04-25 01:34:25 【问题描述】:

我会尽量让我在这里的第一篇文章变得有趣。

最近我对在共享托管服务器上处理 WebSocket 请求的可行性很感兴趣。

请不要告诉我“升级您的计划”。至少在 VPS 上,所有这些都是微不足道的。我意识到这一点。

众所周知,共享主机会...

如果看到一个守护进程,则杀死它 阻止使用服务器套接字 拒绝你的 shell 访问 保持 apache 不受限制(不安装模块)

这些限制完全消除了 phpwebsocket、python。需要一个伪装成网页的无守护进程解决方案。

PHP 是我最喜欢的服务器端语言,我制作了一个伪装成网页的 PHP websocket 网关。

到目前为止,我已经成功地为握手和流输出发送了正确的标头(使用输出缓冲),但我仍然不知道如何在初始请求后继续读取数据。

简而言之,即使在 PHP 脚本启动后,我也想继续从客户端接收数据。我曾尝试阅读 php://input 伪文件,但在 GET 结束后我似乎无法再读取它。是否有任何设置或黑客可以允许这样做?

谢谢!

【问题讨论】:

如果你没有守护进程,究竟什么会处理 websocket 上的流量?这听起来充其量只是一个令人沮丧的秘诀...... Apache 是守护进程。当 websocket 连接进来时,它会调用我的 php 脚本。 Apache 会很高兴获得执行时间过长的脚本;你觉得它只工作三到五分钟左右好吗? 这不是问题。如果需要,客户端可以简单地创建一个新连接。它仍然会比彗星更有效。 【参考方案1】:

简短版本:您尝试做的事情根本不可能。

长版本:你能得到的最好的是一个单向通信通道,它在你的浏览器中看起来像一个 websocket 连接,但只能在一个方向上工作。从服务器到浏览器。另一个方向根本行不通,因为网络服务器不知道您正在尝试使用与 HTTP 不同的协议,并且无法告诉它。至少在您刚刚概述的情况下不会。

【讨论】:

【参考方案2】:

您的问题是 Apache 本身。一旦 Apache 读取了第一个 HTTP 请求(websocket 握手),它将继续从 TCP 连接中读取任何额外的 HTTP 请求。因此,在 TCP 连接上发送的任何新数据将永远不会传递到您的脚本。这是必要的,因为 HTTP/1.1 协议默认支持 Keep-Alive,这意味着在一个 TCP 连接上完成多个请求/响应周期。浏览器不会为每个请求打开 HTTP 连接(这是 HTTP/1.0 中的默认设置)。您无法更改此行为。要实现 websocket 服务器,您需要设置自己的套接字。

【讨论】:

【参考方案3】:

WebSocket 握手完成后,它的工作方式与常规套接字非常相似。 Apache 没有理由允许没有标头的单向通信。

【讨论】:

以上是关于PHP中没有守护程序的WebSocket服务器?的主要内容,如果未能解决你的问题,请参考以下文章

500内部错误Laravel,通过websocket守护进程获取图像

CTRL+C w/ Spring Boot & Gradle 杀死 Gradle 守护进程

PHP websocket服务器和mysql连接

PHP程序守护进程化

PHP Websocket 服务器 hybi10

Php cli是守护进程的吗