6

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

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

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

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

  • 如果他们看到一个守护进程,就杀死它
  • 阻止使用服务器套接字
  • 拒绝您的外壳访问
  • 保持 apache 不受限制(无模块安装)

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

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

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

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

谢谢!

4

3 回答 3

5

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

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

于 2012-11-01T17:51:38.370 回答
1

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

于 2012-11-01T15:20:23.677 回答
0

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

于 2012-04-28T07:12:04.657 回答