我是WebSocket
世界的新手,即使在一周之后,我仍然无法找到如何在不使用任何第三方库的情况下将其与PHP
一起使用。或者不确定它是否可能。
我有3个问题,
1)我们是否必须使用某些第三方API或Ratchet,PHP-Push-WebSocket或PHP WebSocket等库来启用PHP以通过WebSocket协议进行通信?
2)如果您对上述问题的回答是肯定的,那么使用Apache mod_proxy_wstunnel
的优势/目的是什么?
3)如果我使用任何PHP WebSocket第三方库,那么我是否还需要启用和使用Apache的mod_proxy_wstunnel
?如果否,那么Apache的mod_proxy_wstunnel的目的又是什么?
我经历了这个Using go-websocket behind Apache mod_proxy_wstunnel。在这个问题中,OP指出了一些go-websocket但不幸的是链接正在给出404错误,因此我无法理解用户是否使用过任何第三方API。
任何帮助都将受到高度赞赏。提前谢谢。
答案 0 :(得分:5)
不为WS创建PHP。当然,你可以这样做,但它充满了while (true)
和fsock_open
[*] 。并且您必须有权访问shell以使用php-cgi运行WS-server。 (通常)
选择支持线程/异步通信的语言。现在位于顶部的是Node.js。此外,更好地使用专用库来支持旧浏览器等。如果您正在考虑使用ajax的替代方案,那么您可以使用socket.io。如果要创建一对一通信(例如聊天,广播消息),请更进一步使用其中一个Bayeux
实现,例如:Faye。
mod_proxy_wstunnel
扩展名为WS服务器添加了一个额外的层。根据配置,它可以支持DDoS,队列,负载平衡,本地端口交换和https支持。但最好将此用于nginx。
因此,对于测试,您不需要mod_proxy_wstunnel
,并且在制作时,您应该添加额外的安全层,例如NGINX ws tunelling。
[*]抱歉,我犯了一些错误。 PHP对WebSockets有本机支持。该内容将使您在PHP中对WS产生负面影响。
Websockets是事件,PHP管理不善。
答案 1 :(得分:1)
仅说明一下为什么Apache + PHP不适合WebSocket支持...
1)我们是否需要使用一些第三方API或库,例如Ratchet,PHP-Push-WebSocket或PHP WebSocket,以使PHP能够通过WebSocket协议进行通信?
否,您可以只打开本地套接字并使用低级套接字API(example)接受请求,甚至可以将现有请求升级到WebSocket。但是有一个问题-请继续阅读...
2)如果您对上述问题的回答是“是”,那么使用Apache的
mod_proxy_wstunnel
的优势/目的是什么?
mod_proxy_wstunnel
的优势在于,它允许用户使用服务器的HTTP(S)端口(通常为80或443)与服务器建立WebSocket连接,而不是通过自定义端口(例如9000)进行连接。但是,这并没有消除步骤1,因为它只是代理从Apache到自定义端口的WebSocket连接。
3)如果我使用任何PHP WebSocket 3rd Party Library,那么我仍然需要启用和使用Apache的mod_proxy_wstunnel吗?
Apache / PHP设置的问题是PHP代码始终始终在特定的HTTP请求范围内运行。这是一个问题,因为Apache不适用于长时间运行的请求。 Apache可以支持非常少的活动请求(通常为150个左右),仅够处理中等大小站点上的常规(短命)流量。另外,默认情况下,max_execution_time
设置为5分钟,这意味着此后任何请求(以及其中的任何WebSocket连接)都将被杀死。
如果否,那么再次使用Apache
mod_proxy_wstunnel
的目的是什么?
mod_proxy_wstunnel
处理持久连接,而不会占用请求线程。因此,它允许一个Apache实例处理数十万个WebSocket连接。但是同样,它只是一个隧道,它不能“调用” PHP,因为它只能将WebSocket连接代理到其他应用程序。
如果您有权访问服务器计算机,则可以运行一个独立的PHP脚本,该脚本将WebSocket连接作为守护程序在外部 Apache(例如,通过systemd)来处理,并可以选择使用{{1} }代理请求。
但是,就其本身而言,Apache + PHP体系结构不适合生产级WebSocket支持。