共享主机上的 Websocket:由于共享主机本身或非 PHP 集成而无法实现?

Enr*_*ico 7 php websocket

我想在我的共享主机上运行基本的聊天应用程序。我将使用 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();
Run Code Online (Sandbox Code Playgroud)

我注意到有类似的问题,但大多数答案都说这是不可能的,因为提问者试图使用 Node.js 或 Python websockets 库,而大多数共享主机不支持这些库。

hal*_*fer 13

主要回答

共享主机通常允许您监听高端口,例如您正在使用的端口。但在实践中会遇到很多问题。

首先,Web 服务器可能只允许 80 (HTTP) 和 443 (HTTPS) 入站,因此 8081 端口将被防火墙阻止。您的 PHP 侦听器将连接到该端口,但会耐心等待永远不会到来的流量。

其次,一些共享主机前面会有一个负载均衡器,它们可能只配置为转发 HTTP 流量。由于 Web 套接字是不同的协议,因此不会将它们设置为转发该协议。这里也重复了与端口相同的问题 - 非标准端口不会被转发。

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

设计问题

我还要提请注意使用 Web 套接字的非标准端口来为标准 80/443 端口上的 Web 应用程序提供服务。这并不总是一个好主意。非标准端口在台式机和标准家庭互联网连接上可以正常工作,但对于某些办公室或移动互联网连接,您可能会陷入困境。

最好在应用程序前面放置一个负载均衡器,然后让它根据协议签名路由流量(Web Socket 或 HTTP)。这将允许您在每个端口使用多个协议。如果您有兴趣探索这一点,我推荐 Traefik 与 Docker 容器 - 我已经设置了它并且它确实运行得很好。

  • @Enrico,这完全取决于您如何设置服务器。确保 WS 侦听器始终启动的一个好方法是在 Supervisor(或其他进程观察器)中运行它。如果您使用 Docker/Traefik,则使用 Docker 或 Docker Compose 重启策略。 (2认同)