我会尽量让我的第一篇文章尽可能有趣。
最近,我对在共享托管服务器上处理WebSocket请求的可行性感兴趣。
请不要告诉我“升级您的计划”。所有这些至少在VPS上都是微不足道的。我意识到了。
众所周知,共享主机将......
这些限制完全消除了phpwebsocket,python。需要伪装成网页的无守护进程解决方案。
PHP是我最喜欢的服务器端语言,我制作了一个伪装成网页的PHP websocket网关。
到目前为止,我已成功为握手和流输出发送正确的标头(使用输出缓冲),但我仍然无法弄清楚如何在初始请求后继续读取数据。
简而言之,即使在PHP脚本启动后,我仍希望继续从客户端接收数据。我已经尝试过阅读php://输入pseudofile,但是在GET结束后我似乎无法再读取它。是否有任何设置或黑客可以允许这个?
谢谢!
答案 0 :(得分:5)
简短版本:您尝试做的事情根本不可能。
长版本:你能得到的最好的是一个单向的通信通道,它看起来像浏览器中的websocket连接,但只适用于一个方向。从服务器到浏览器。另一个方向根本不起作用,因为Web服务器不知道您尝试使用与HTTP不同的协议,并且无法告知它。至少在您刚刚概述的场景中没有。
答案 1 :(得分:0)
完成WebSocket握手后,它的工作原理与常规套接字非常相似。 Apache没有理由允许没有标头的单向通信。
答案 2 :(得分:0)
你的问题是Apache本身。一旦Apache读取了第一个HTTP请求(websocket握手),它将继续从TCP连接读取任何其他HTTP请求。因此,TCP连接上发送的任何新数据都不会传递给您的脚本。这是必要的,因为HTTP / 1.1协议默认支持Keep-Alive,这意味着在一个TCP连接上完成多个请求/响应周期。浏览器不会为每个请求打开HTTP连接(这是HTTP / 1.0中的默认设置)。您无法更改此行为。要实现websocket服务器,您需要设置自己的套接字。