Swoole协程HTTPS调用失败主因是PHP运行时加载的OpenSSL库不支持TLS 1.2+,需确保php -i中OpenSSL Library Version≥1.1.1且与Swoole编译所用版本一致,否则Co\Http\Client等将报SSL错误。

这不是 Swoole 自己版本低,而是 PHP 运行时加载的 OpenSSL 库不支持 TLS 1.2+,导致 Co\Http\Client、file_get_contents('https://') 等协程 HTTPS 调用直接失败或报错 URL error 1014: SSL verify failed。
php -i 显示的 OpenSSL Library Version 才是关键
系统 openssl version 是 1.1.1w 没用,PHP 编译时链接的是哪个 OpenSSL 库,才决定实际能力。运行:
php -i | grep -i "openssl\|tls"
重点看两行:
-
OpenSSL Library Version(运行时加载的库版本) -
OpenSSL Header Version(编译时头文件版本)
如果前者是 1.0.2u(宝塔常见),后者却是 1.1.1w,说明 PHP 是用旧 OpenSSL 编译的,但系统已升级——Swoole 协程 HTTPS 就会崩。
验证 TLS 1.2 是否真可用:
php -r "var_dump(stream_context_get_options(stream_context_create(['ssl'=>['crypto_method'=>STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT]])));"
报错即不支持,必须重编 PHP 或 Swoole。
CentOS/RHEL 宝塔用户:别只升级系统 OpenSSL
宝塔默认 PHP 是用系统自带 OpenSSL 1.0.2 编译的,yum update openssl 不会改变 PHP 的链接目标,反而可能让 php -i 输出混乱。
正确做法分两步:
- 先装新版 OpenSSL 到独立路径:
./config --prefix=/opt/openssl-1.1.1w --openssldir=/opt/openssl-1.1.1w shared zlib,再make && sudo make install - 重编 PHP:
./configure --with-openssl=/opt/openssl-1.1.1w ...,务必make clean并清空config.cache
完成后 php -i | grep "OpenSSL Library Version" 必须显示 1.1.1w,否则 Swoole 的 HTTPS 功能仍不可用。
macOS 上 pecl install 报 “openssl/ssl.h not found”
这不是缺 OpenSSL,是 Homebrew 安装的头文件路径没被编译器自动识别。Catalina 及之后版本默认不搜索 /usr/local/include。
别用 cp -R 硬拷贝——下次 brew upgrade openssl 就失效。
正确做法是建符号链接:
- Intel Mac:
sudo ln -s /usr/local/opt/openssl/include/openssl /usr/local/include/openssl - Apple Silicon:
sudo ln -s $(brew --prefix openssl@3)/include/openssl /usr/local/include/openssl(先brew --prefix openssl@3确认路径)
或者临时生效:CPPFLAGS="-I$(brew --prefix openssl)/include" pecl install swoole。
pecl install 时输 yes 启用 OpenSSL 却报错
这个交互式提示本质是 pecl 在调用 ./configure,输 yes 后它会尝试自动探测路径,失败就中断。
必须在输 yes 后**立刻追加路径参数**,格式不能错:
pecl install swoole # 当提示 enable openssl support? [no] 时,输入: yes --with-openssl-dir=/usr/local/opt/openssl
路径以 find /usr -name evp.h 2>/dev/null 结果为准;若漏掉 --enable-openssl 开关,php --ri swoole 里 openssl 项会显示 disabled,Co\Http\Client 直接不可用。
最易忽略的一点:所有涉及 OpenSSL 的功能(包括 WebSocket SSL、TLS context、协程 MySQL over SSL)都依赖同一个底层库版本对齐——不是装了开发包就完事,PHP、Swoole、系统 OpenSSL 三者运行时加载的库必须一致,否则问题会分散出现在不同模块,排查时容易误判为独立 bug。


















