PHP无内置WebSocket客户端,需用纯PHP库(如textalk/websocket)或Swoole协程HTTP客户端升级实现;C扩展基本不可用;wss连接必须启用OpenSSL扩展。

PHP 本身不支持 WebSocket 客户端连接
PHP 没有内置的 WebSocket 客户端扩展,fsockopen 或 cURL 都无法直接完成 WebSocket 握手和帧解析。你不能靠开启某个“WebSocket 扩展”就让 file_get_contents 或原生 curl_exec 连上 wss:// 地址并收发消息。
实际可用的方案只有两类:纯 PHP 实现 or C 扩展
主流选择是使用纯 PHP 的 WebSocket 客户端库,它们自己实现 RFC 6455 握手、掩码、帧编码/解码逻辑。C 扩展(如 php-websocket)极少维护、不兼容 PHP 8+、无 Packagist 支持,基本不可用。
-
textalk/websocket:轻量、无依赖、支持ws/wss、可自定义超时与 header -
ratchet/pawl:基于 ReactPHP,适合异步长连接场景,但需 EventLoop 环境 - 避免使用已废弃的
devristo/phpws或cboden/ratchet(服务端库,不提供客户端)
SSL/TLS 连接必须启用 OpenSSL 扩展
连 wss:// 本质是 TLS over TCP,PHP 必须编译并启用 openssl 扩展。否则会报错:Unable to connect to wss://xxx: failed to open stream: operation failed。
- 检查是否启用:
php -m | grep openssl - 若未启用,需在
php.ini中取消注释extension=openssl(Windows 下为php_openssl.dll) - 某些 Docker 镜像(如
php:alpine)默认不含 OpenSSL,需手动apk add php81-openssl类似操作
别被“swoole_websocket_client”误导
Swoole 的 Swoole\Coroutine\Http\Client 可升级为 WebSocket,但它不是独立扩展,而是 Swoole 扩展的一部分;且仅在协程环境下工作,普通 FPM 或 CLI 同步模式下无效。
立即学习“PHP免费学习笔记(深入)”;
- 启用前提:已安装
swoole扩展(非swoole_websocket_client单独扩展) - 必须用
Swoole\Runtime::enableCoroutine()或在co::run中调用 - 错误写法:
new Swoole\WebSocket\Client(...)—— 这个类根本不存在
真正要用 Swoole 做 WebSocket 客户端,得走 Swoole\Coroutine\Http\Client + upgrade() 流程,细节比纯 PHP 库更易出错。











