使用Apache的mod_proxy_wstunnel连接PHP而无需使用第三方API

9

我初次接触WebSocket,即使一周后仍然无法找到如何在PHP中使用它而不使用任何第三方库的方法。甚至不确定是否可能。

我有3个问题:

1)我们必须使用像RatchetPHP-Push-WebSocketPHP WebSocket这样的第三方API或库才能让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。

非常感谢任何帮助。提前致谢。


请投反对票的人也说明投反对票的原因。谢谢。 - Airy
2
在理想的情况下,您不应该使用Apache或PHP来处理Web套接字。您应该使用node.js。现在,这并不意味着您的后端应该用JavaScript编写。它只是意味着node.js是服务器,对于服务器端处理,您可以简单地使用RESTful查询来访问您的PHP应用程序。如果您使用第三方工具与PHP一起使用,那么您最终会启动一个由PHP编写的服务器,并将应用程序代码嵌入到该服务器中。由于许多原因(关注点分离,将应用程序代码与服务器代码混合等),这并不理想。 - Mjh
2个回答

3
PHP并不是为了支持WebSocket而创建的。当然你也可以用PHP来实现WebSocket,但这种方式通常需要大量使用while (true)fsock_open等代码,并且你需要访问shell以运行php-cgi作为WebSocket服务器(通常情况下)。
选择一个支持线程/异步通信的语言。目前最流行的是Node.js。此外,最好使用专门的库来支持旧版浏览器等。如果你正在寻找替代ajax方案,那么可以使用socket.io。如果你想创建一对多的通信(例如聊天、广播消息),请再进一步使用Bayeux实现之一,例如:Fayemod_proxy_wstunnel扩展为WebSocket服务器增加了一个额外的层次。根据配置,它可以支持DDoS、队列、负载均衡、本地端口交换和https支持。但最好在nginx上使用它。
所以,在测试时你不需要mod_proxy_wstunnel,而在生产环境中,你应该添加一个额外的安全层,例如NGINX WebSocket隧道。
[*] 抱歉,我犯了一些错误。PHP具有原生支持WebSocket的功能。这段内容可能会对你对PHP中WebSocket的看法产生负面影响。
WebSocket是事件,而PHP在处理WebSocket方面管理不善。

好答案。让我们看看其他人的建议。 - Airy
1
PHP支持异步通信。请参见https://reactphp.org/ / http://php.net/manual/en/function.socket-set-nonblock.php / http://php.net/manual/en/function.socket-select.php。 - hanshenrik
是的,但WS的真正强大之处在于持久连接。对客户端非常有用,但在服务器上执行如何?你能行吗?它会有多高效?这里有一个简单的PHP WS聊天服务器:https://github.com/sanwebe/Chat-Using-WebSocket-and-PHP-Socket/blob/master/server.php - bato3

1

只是稍微解释一下为什么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支持。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接