我想在我的共享主机上运行基本的聊天应用程序。我将使用 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 容器 - 我已经设置了它并且它确实运行得很好。