一、问题描述
最近在一台老机子上编译安装swoole拓展,装后发现在协程中发起https请求,swoole会产生段错误。
1 | [2025-02-03 17:08:39 $10498.0] WARNING Server::check_worker_exit_status(): worker(pid=10507, id=3) abnormal exit, status=0, signal=11 |
二、问题定位
- 排查是否是目标地址无法建立请求导致,使用curl测试
1 | curl -vvv https://xxxx.com |
目标地址正常,那排查是否是刚编译安装的swoole扩展有问题。
由于开启了enable_coroutine函数自动协程化,所以无论是标准库curl、file_get_contents,还是Guzzlehttp都无法建立https请求。而原生php调用正常,确定只在swoole中调用会产生该问题。更换成http协议请求正常,推测可能是tls阶段异常。
发现机子安装了多个版本的openssl,且php的openssl版本和swoole编译的openssl版本不一致
1 | # 查看openssl拓展版本 |
三、解决方案
临时解决方案
https请求指定系统默认ca证书,例如在Guzzlehttp中
1 | ... |
一劳永逸解决方案
重新编译swoole拓展,手动指定–with-openssl-dir 目录,确保和php的openssl拓展版本一致
1 | ./configure --enable-openssl \ |
- 本文作者: 暮秋人
- 本文链接: https://muqiuren.pages.dev/2025/02/swoole-openssl-https-error/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!