如何在Heroku上部署运行基于Ratchet的PHP WebSocket应用
问题原因说明
Heroku平台对外仅开放80(HTTP)和443(HTTPS/WSS)端口,自定义端口的外部请求会直接被平台防火墙拦截。同时平台会给每个启动的web进程动态分配内部端口,通过PORT环境变量传递给应用,写死端口会导致服务绑定错误,无法接收路由转发的流量。另外你用heroku run bash启动的是临时独立容器,不和公网路由打通,即使绑定端口正确也收不到外部请求。
具体修改步骤
- 调整服务端端口配置
修改socket.php中的端口定义代码,替换为读取Heroku环境变量的动态端口:
// 替换原代码 define('APP_PORT', 8889); define('APP_PORT', getenv('PORT') ?: 8889);
本地开发时会默认使用8889端口,部署到Heroku时自动读取平台分配的端口。
- 配置正确的进程启动规则
在项目根目录创建名为Procfile的无后缀文件,写入以下内容:
web: php socket.php
这会告知Heroku部署时以web进程类型启动你的WebSocket服务,自动对接公网路由,不需要再手动执行命令启动服务。
- 修改前端WebSocket连接配置
- 移除地址后的自定义端口,Heroku会自动将WSS请求转发到你的服务进程
- 将
ws协议替换为wss,Heroku默认强制HTTPS访问,非加密的WS请求会被拦截
修改后的代码如下:
new WebSocket('wss://xamchat.herokuapp.com');
注意事项
如果使用Heroku免费版dyno,超过30分钟无任何请求会自动休眠,会导致WebSocket连接断开,可通过升级付费dyno或设置定时保活请求避免该问题。
内容的提问来源于stack exchange,提问作者Xam Mlr
相关产品推荐
相关产品推荐

