Composer 不安装 WebSocket 客户端,仅管理依赖;推荐 textalk/websocket 库实现轻量客户端通信,需手动处理连接、心跳、重连及 SSL 配置等。

Composer 本身不安装 WebSocket 客户端
Composer 是 PHP 的依赖管理工具,它只负责下载和管理包,不“安装”客户端——真正起作用的是你选的 WebSocket 库。常见误区是以为 composer require 后就能直接连上 WebSocket 服务,其实它只是把类库拉下来,后续的连接、握手、心跳、消息收发全靠你自己写逻辑或调用库提供的 API。
推荐用 textalk/websocket 实现基础双向通信
这个库轻量、无外部扩展依赖(纯 PHP 实现)、支持 RFC6455,适合调试和中小型场景。注意它不支持服务端,仅作客户端使用。
- 运行
composer require textalk/websocket - 连接时需显式指定协议(
ws://或wss://),不支持自动降级 - 发送消息前必须等
open事件触发,否则会抛出WebSocket\ConnectionException - 接收消息是阻塞式轮询(
$ws->receive()),不适合高并发长连接;如需异步,得配合ext-event或改用reactphp/socket+evenement/evenement
简单示例:
$ws = new WebSocket\Client("ws://echo.websocket.org");
$ws->send("hello");
echo $ws->receive(); // 输出 hello
$ws->close();
遇到 Connection refused 或 SSL operation failed 怎么办
这类错误几乎都和环境配置有关,不是代码问题。
-
Connection refused:检查目标地址是否可访问(telnet host port),确认服务端已启动且监听在公网/对应 IP,PHP 进程有 outbound 网络权限 -
SSL operation failed:用wss://时,若服务端证书非权威签发(如自建 TLS),需传入上下文选项禁用校验:["context" => stream_context_create(["ssl" => ["verify_peer" => false, "verify_peer_name" => false]])] - 某些内网环境 DNS 解析失败,可直接用 IP + Host 头绕过:
new WebSocket\Client("ws://192.168.1.100:8080", ["headers" => ["Host" => "example.com"]])
别忽略心跳与重连逻辑
真实环境中,WebSocket 连接可能被中间代理、防火墙或服务端主动断开,而 textalk/websocket 默认不发 ping/ping,也不自动重连。
- 手动发心跳:每 30 秒调一次
$ws->ping()(注意部分服务端要求特定格式的 ping 数据) - 检测断连只能靠
receive()抛异常(如WebSocket\ConnectionException或空返回),需捕获后重建连接 - 重连建议加指数退避(首次 1s,失败则 2s、4s…上限 30s),避免雪崩请求打垮服务端
实际项目里,这部分逻辑比建立连接更花时间调试。










