在DigitalOcean App Platform部署PHP Ratchet WebSocket服务器连接失败求助
解决DigitalOcean App Platform部署PHP Ratchet WebSocket服务器连接错误
核心问题分析
你的启动命令heroku-php-apache2 && php startServer.php存在致命问题:heroku-php-apache2是阻塞式进程,会一直占用前台运行,导致后面的php startServer.php永远不会执行。此外,硬编码端口、监听地址限制、WSS路由配置也可能是连接失败的诱因。
具体修复步骤
1. 修正启动命令,确保双进程正常运行
将启动命令改为后台启动Ratchet,再运行Apache(前台进程保持应用存活):
php startServer.php & heroku-php-apache2
或者用更可靠的启动脚本方式:
- 在项目根目录创建
start.sh文件:
#!/bin/bash # 后台启动Ratchet WebSocket服务器 php startServer.php & # 启动Apache托管客户端页面 heroku-php-apache2
- 给脚本添加执行权限(提交到Git前执行,或在部署构建命令中添加):
chmod +x start.sh
- 将DO App Platform的启动命令改为:
./start.sh
2. 动态读取端口,适配DO环境
DigitalOcean会通过PORT环境变量分配端口,不能硬编码8080。修改startServer.php:
use Ratchet\Server\IoServer; use Ratchet\Http\HttpServer; use Ratchet\WebSocket\WsServer; use MySocketServer; require dirname(__DIR__) . '/vendor/autoload.php'; // 读取环境变量端口,本地测试 fallback 到8080 $port = getenv('PORT') ?: 8080; // 监听所有外部可访问的接口(必须是0.0.0.0,不能是localhost) $server = IoServer::factory( new HttpServer( new WsServer( new MySocketServer() ) ), $port, '0.0.0.0' ); echo "WebSocket server running on port {$port}\n"; $server->run();
3. 确认WSS连接路径配置
- 客户端连接地址需改为
wss://你的域名/(如果Ratchet根路径处理WebSocket),或wss://你的域名/ws(如果设置了路由前缀)。 - 若使用
RouteProvider配置路由,确保路径匹配:
use Ratchet\App; $app = new App('你的域名', $port, '0.0.0.0'); $app->route('/ws', new MySocketServer(), ['*']); $app->run();
此时客户端连接地址应为wss://你的域名/ws。
4. 排查日志定位问题
- 查看DigitalOcean App Platform的运行日志,确认Ratchet是否成功启动(搜索
WebSocket server running关键字)。 - 打开浏览器控制台,查看WebSocket连接的具体错误:
- 错误代码1006:连接异常关闭,通常是服务器未启动或端口/地址配置错误。
- 连接超时:服务器未监听0.0.0.0,或端口未正确映射。
5. 确保依赖已正确安装
在DO App Platform的构建命令中添加composer install --no-dev,确保Ratchet依赖被正确安装:
composer install --no-dev
内容的提问来源于stack exchange,提问作者user2342558
相关产品推荐
相关产品推荐

