PHP 共享主机上的 WebSockets
Posted
技术标签:
【中文标题】PHP 共享主机上的 WebSockets【英文标题】:WebSockets on PHP shared hosting 【发布时间】:2012-02-21 01:52:30 【问题描述】:我一直在研究显示“在线用户”计数器的最佳方式,该计数器已更新为第二个,以避免持续的 ajax 轮询。
显然 WebSockets 似乎是最好的选择。由于这是一个 Intranet,我将要求使用 Chrome 或 Safari,因此不应该存在兼容性问题。
自从我刚接触 WebSockets 以来,我一直在阅读一些关于 WebSockets 的文章,我想我非常了解它的工作原理。
我不太确定如何用 php 实现它。 Node.js 似乎是这样做的自然选择,因为它具有“始终运行”的特性,但这不是一个选择。
为什么我最困惑的是 PHP 运行并且当它完成时它结束的事实。如果PHP结束了,socket连接不会丢失吗?或者如果 php 重新运行,它会通过 ip 回溯用户? (我觉得不太可能)
然后我找到了这个库 http://code.google.com/p/phpwebsocket/ 但它似乎有点旧(它提到只有 Chrome nightly 与 WebSockets 兼容)
在某一点上说“从命令行,运行 server.php 程序以侦听套接字连接。”这意味着我需要 SSH,这是许多共享主机计划所没有的。
我的另一个疑问是该库的源代码中的另一行:
set_time_limit(0);
这是否意味着 php 文件将连续运行?这允许在共享主机中吗?据我所知,所有主机都会在超时 1 o2 分钟后杀死 php。
我有一个在线用户的 mysql 表,我想使用 PHP 通过 websocket 向这些在线用户广播登录用户的数量。有人可以帮助我或向我指出如何实现这一目标的更好信息吗?
谢谢
【问题讨论】:
web-sockets 很受欢迎,但如果您可以使其工作,服务器发送的事件可能更适合您的目的。 SSE 显然可以在带有 JS 的旧浏览器中支持,而 websockets 则不是,而且您似乎不需要双向通信。我正在尝试解决 PHP SSE 问题:***.com/questions/9070995/… 我没有任何兼容性问题,因为我可以控制所使用的浏览器,而且我对 WebSockets 很感兴趣,因为我已经看到它在 trello.com 上运行,而且它的运行方式很迷人 我建议您不要尝试将 PHP 用于有状态应用程序,因为 PHP 最初就是为此类应用程序设计的。正如您所指出的,共享主机也可能会阻止打开任意套接字。最好的办法是拥有自己的 VPS 服务器lowendbox.com 我刚刚尝试了与您描述的完全相同的设置,Juan... 我有一个共享 PHP 主机,可以通过 SSH 访问,但是客户端 WebSockets 没有连接到端口 12345 上正在运行的服务器。我我很确定共享主机有防火墙并阻止所有端口不是 80。 【参考方案1】:Websockets 即使在专用主机上也需要很多东西,除了共享主机。
对于您的要求,服务器发送事件 (sse) 是正确的选择,因为只有服务器会将数据推送到客户端。
SSE 可以简单地调用服务器脚本,很像 ajax,但是客户端将接收并能够在数据进入时部分地进行处理。每当有数据进入时,就会生成 Dom 事件。
但 IE 即使在版本 10 中也不支持 SSE。因此对于 IE,您必须使用一些后备技术,例如“永久 iframe”。
就托管而言,普通的共享托管(以及那些不是很便宜的)将允许 php 脚本长时间运行,只要它们不被视为问题。
【讨论】:
以上是关于PHP 共享主机上的 WebSockets的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET 上的 WebSockets/长轮询 - 共享主机?