共享托管上的WebSocket:由于共享托管本身或由于非PHP集成而不可能



我想在共享托管上运行基本聊天应用程序。我将使用PHP Websockets实现库,Ratchet。

但是,当我转到共享托管(hostgator(Websockets信息页面时,它说:

PHP插座支撑? 如果您要连接,它应该起作用。我们不允许客户绑定到本地端口以进行传入。

这是什么意思?我可以通过SSH创建自己的Websocket运行该命令吗?我将使用此基本代码来运行它。

require dirname(__DIR__) . '/vendor/autoload.php';
$server = IoServer::factory(
    new HttpServer(
        new WsServer(
            new Chat()
        )
    ),
    8081
);
$server->run();

我注意到有类似的问题,但是大多数答案都说这是不可能的,因为发问者试图使用node.js或python websockets库,这些库不支持大多数共享托管。

<</p>

主要答案

共享的托管通常允许您在高端口上收听,例如您正在使用的那个。但是,实践中会有许多问题。

首先,Web服务器可能只允许80(HTTP(和443(HTTPS(入站,因此8081的港口将被防火墙阻止。您的PHP听众会附着在港口上,但会耐心地等待永远不会出现的流量。

其次,一些共享主机在其前面将具有负载平衡器,并且可能只配置为转发HTTP流量。由于Web插座是一个不同的协议,因此不会设置它们来转发它。端口也在这里重复出现同样的问题 - 非标准端口不会转发。

要解决这些问题,您需要自己的Web服务器,可以在其中以任何喜欢的方式打开端口(并设置负载平衡器(。如今,这很便宜 - 每月几个咖啡馆咖啡的价格,您可以租用小型虚拟服务器。它的RAM不会像共享服务器那样多,但是它会更加灵活。

设计问题

我还会引起人们对使用非标准端口进行Web插座的关注,以在标准80/443端口上为Web应用程序提供服务。这并不总是一个好主意。非标准端口将在台式机和标准家庭互联网连接上正常工作,但是对于某些办公室或移动互联网连接,您可能会进入泡菜。

最好将负载平衡器放在应用程序的前面,然后根据协议签名将其路由流量(Web套接字或HTTP(。这将允许您每个端口使用多个协议。如果您有兴趣探索此问题,我建议使用Docker容器进行Traefik - 我已经进行了设置,并且确实效果很好。

最新更新