PHP WebSocket客户端重连间隔由所用第三方库控制,如textalk/websocket需手动实现sleep()重试,reactphp/websocket-client则通过RetryPromise配置延迟与退避策略。

PHP WebSocket 客户端重连间隔由谁控制?
PHP 本身没有内置 WebSocket 客户端,ext-websocket 也早已废弃。实际项目中,你用的几乎肯定是第三方库(如 textalk/websocket、ratchet/pawl 或 reactphp/websocket-client),**重连逻辑和间隔完全由该库实现,PHP 运行时不参与调度**。
这意味着:不能靠修改 php.ini、调整 set_time_limit 或 PHP tick 机制来设重连间隔——它根本不在 PHP 层面触发。
textalk/websocket 怎么设重连延迟?
textalk/websocket(最常用)默认不自动重连,必须手动实现。常见写法是捕获异常后用 sleep() + 循环重试:
$reconnectDelay = 3; // 秒
while (true) {
try {
$client = new WebSocket('ws://example.com');
$client->send('hello');
break;
} catch (Exception $e) {
error_log('WebSocket connect failed: ' . $e->getMessage());
sleep($reconnectDelay);
}
}⚠️ 注意:sleep() 会阻塞整个进程,在 CLI 脚本中可用;但若跑在 Web SAPI(如 Apache/PHP-FPM)里,会导致请求超时、资源卡死,**绝对不能这么用**。
立即学习“PHP免费学习笔记(深入)”;
reactphp/websocket-client 的重连怎么配?
reactphp/websocket-client 基于 ReactPHP 异步事件循环,重连需自行封装,但可借助 React\Retry\RetryPromise 控制间隔:
-
maxAttempts:最大重试次数 -
delay:基础延迟(毫秒),支持指数退避(传入回调函数) - 必须显式调用
$connector->connect(...)触发重连,不是连接断开后自动重试
示例关键片段:
use React\Retry\RetryPromise;
$retry = new RetryPromise(3, function ($attempt) {
return 1000 * pow(2, $attempt); // 第1次1s,第2次2s,第3次4s
});
$retry($connector->connect('ws://example.com'))
->then(function (ConnectionInterface $conn) {
// 成功连接
});重连间隔设置最容易忽略的点
真正影响可用性的不是“怎么设间隔”,而是:
- 是否区分了「首次连接失败」和「运行中掉线」:后者需监听
onClose/onError并触发重连,前者只是初始化失败 - 是否做了退避策略:固定 1 秒重连可能压垮服务端,尤其多个客户端同时启动时
- 是否检查了底层 DNS / TLS 握手超时:这些失败可能比 WebSocket 协议层错误更早发生,
connect()抛异常前就卡住了 - CLI 脚本里用
sleep()看似简单,但没处理信号中断(SIGTERM)会导致无法优雅退出
重连不是加个 sleep() 就完事——得看你在哪一层断、谁在管连接生命周期、以及服务端能不能扛住你的重试节奏。











