根本原因是编译swoole时缺失关键依赖(如php-dev、openssl-devel、libcurl-devel等),导致configure静默跳过扩展生成,make install未安装任何文件;需先装开发包再显式指定路径。

找不到 swoole 扩展,php -m 里没它
根本原因不是“没装 Swoole”,而是编译时缺了关键依赖,导致 make 静默跳过扩展生成,最后 make install 什么也没装进去。常见现象是执行完安装脚本,php --ri swoole 报错 “Extension 'swoole' not found”,但 php -m 里也压根没有这一行。
实操建议:
- 先运行
phpize --version确认有 PHP 开发头文件(php-dev或php-devel包);没这个,./configure直接失败或降级为不编译扩展 - 检查是否装了
gcc、make、autoconf、automake—— Ubuntu/Debian 下用apt list --installed | grep -E "gcc|make|autoconf"快速扫一遍 - CentOS/RHEL 7+ 必须额外装
openssl-devel和libnghttp2-devel,否则 HTTP/2 和 TLS 支持直接丢弃,且不报错 - 如果用的是 PHP 8.2+,Swoole 5.0.3 之前版本会因 ZTS 兼容问题静默编译失败,建议直接上
swoole-5.1.0+
./configure 报 error: Cannot find OpenSSL's <evp.h></evp.h>
这不是 OpenSSL 没装,而是开发头文件路径没被自动识别。系统装了 openssl 命令,但没装 openssl-devel(RHEL/CentOS)或 libssl-dev(Debian/Ubuntu),configure 就找不到 evp.h、ssl.h 这些头文件。
实操建议:
- RHEL/CentOS:运行
yum install openssl-devel或dnf install openssl-devel - Debian/Ubuntu:运行
apt install libssl-dev - 若已装但 configure 仍找不到,加显式参数:
./configure --with-openssl-dir=/usr/include/openssl(路径按find /usr -name evp.h 2>/dev/null结果调整) - 别用
--without-openssl绕过——Swoole 的Co\HTTP\Client、WebSocket、SSL context全依赖它,禁用等于废掉一半功能
编译通过但 php --ri swoole 显示 undefined symbol: OPENSSL_sk_num
这是典型的 OpenSSL 版本错配:PHP 编译时链接的是 OpenSSL 1.1.x,而 Swoole 编译时找到的是系统默认的 OpenSSL 3.0+(或反过来)。符号名变了,运行时动态链接就崩。
实操建议:
- 查 PHP 实际链接的 OpenSSL:
php-config --ldflags | grep ssl,再看ldd $(php-config --extension-dir)/swoole.so | grep ssl - 统一用系统包管理器装的 OpenSSL,别混用源码编译版。例如 Ubuntu 22.04 默认 OpenSSL 3.0,但 PHP 8.1 是用 1.1 编译的,此时必须给 Swoole 指定旧路径:
./configure --with-openssl-dir=/usr/lib/x86_64-linux-gnu - Mac 上用 Homebrew 装的 PHP 和 OpenSSL 更容易冲突,优先用
brew unlink openssl && brew install php让 PHP 自带 OpenSSL
用 pecl install swoole 却卡在 checking for curl_multi_setopt
PECL 安装本质还是走 ./configure,但它会自动探测系统环境。这个卡点实际是 libcurl 开发包缺失,导致 cURL 功能检测失败,进而影响 Co\Curl 和部分 HTTP 客户端能力。
实操建议:
- Debian/Ubuntu:装
libcurl4-openssl-dev(不是libcurl3) - RHEL/CentOS:装
libcurl-devel - 如果只是临时跳过 cURL 支持(不推荐),加参数:
pecl install -f swoole --configureoptions '--without-curl' - 注意:跳过 cURL 后,
Co\Curl不可用,Co\Http\Client的部分高级选项(如follow_location)也会受限
最常被忽略的是:Swoole 编译过程不会明确告诉你“因为缺 xx,我关掉了 yy 功能”,它只在 config.log 末尾藏一句 checking for xxx... no。真要确认功能开关,得翻 config.log 或装完后跑 php --ri swoole | grep -E "(curl|openssl|http2)" 看实际启用项。










