只是稍微解释一下为什么Apache + PHP不适合支持WebSocket...
1) 我们需要使用第三方API或库,例如Ratchet、PHP-Push-WebSocket或PHP WebSocket来使PHP能够通过WebSocket协议进行通信吗?
不需要,您可以打开本地套接字并使用低级Socket API (example) 接受请求,甚至可以将现有请求升级为WebSocket。但是存在一个问题,请继续阅读...
2) 如果您对上述问题的答案是肯定的,那么使用Apache的mod_proxy_wstunnel
有什么优点/目的?
mod_proxy_wstunnel
的优点在于,它允许用户使用服务器的HTTP(S)端口(通常为80或443)与您的服务器建立WebSocket连接,而无需连接到自定义端口(例如9000)。但这并不会消除步骤1,因为它只是将WebSocket连接从Apache代理到自定义端口。
如果我使用任何PHP WebSocket第三方库,那么我是否仍然需要启用和使用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),并可选择使用
mod_proxy_wstunnel
代理请求到它。
但是仅有Apache + PHP架构不适合生产级别的WebSocket支持。
node.js
。现在,这并不意味着您的后端应该用JavaScript编写。它只是意味着node.js
是服务器,对于服务器端处理,您可以简单地使用RESTful查询来访问您的PHP应用程序。如果您使用第三方工具与PHP一起使用,那么您最终会启动一个由PHP编写的服务器,并将应用程序代码嵌入到该服务器中。由于许多原因(关注点分离,将应用程序代码与服务器代码混合等),这并不理想。 - Mjh