使用Apache的mod_proxy_wstunnel连接到PHP而不使用第三方API

时间:2017-07-18 09:41:35

标签: javascript php node.js apache websocket

我是WebSocket世界的新手,即使在一周之后,我仍然无法找到如何在不使用任何第三方库的情况下将其与PHP 一起使用。或者不确定它是否可能。

我有3个问题,

1)我们是否必须使用某些第三方API或RatchetPHP-Push-WebSocketPHP 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。

任何帮助都将受到高度赞赏。提前谢谢。

2 个答案:

答案 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支持。