装不上swoole扩展主因是php实例、编译工具、配置路径三者未对齐;cli与fpm使用不同php.ini,须分别在对应配置中添加extension=swoole.so并重启服务,同时确保phpize和php-config来自同一php版本且extension_dir路径一致。

装不上 Swoole 扩展,90% 不是命令写错了,而是 PHP 实例、编译工具、配置路径三者没对齐——尤其是 CLI 和 FPM 环境各自加载不同 php.ini,导致“明明加了 extension=swoole.so,php -m 却看不到”。
php -m 里没有 swoole,但 php --ri swoole 能显示版本
这不是没装上,是扩展被加载到了另一个 PHP 实例里。CLI(命令行)和 FPM(Web 请求)用的是两套独立配置,必须分别验证。
- 查 CLI 加载的配置:
php --ini看Loaded Configuration File路径,确认该php.ini末尾有extension=swoole.so - 查 FPM 加载的配置:打开
/www/server/php/*/etc/php-fpm.d/www.conf,找php_admin_value[extension]或它引用的主php.ini,同样确认存在该行 - 改完配置后,不能只
systemctl restart php-fpm-xx:必须先执行bt 16(宝塔重载 PHP 配置),再重启 FPM - 验证 CLI 是否生效:
php -m | grep swoole;验证 FPM 是否生效:写个<?php print_r(get_loaded_extensions()); ?>页面访问
configure: error: Cannot find OpenSSL's
系统装了 OpenSSL 命令,但没装开发头文件包,./configure 阶段找不到编译依赖。
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
- Ubuntu/Debian:
sudo apt-get install -y libssl-dev - CentOS/RHEL:
sudo yum install -y openssl-devel(或dnf install -y openssl-devel) - 装完仍报错?用
find /usr -name evp.h 2>/dev/null定位路径,然后显式传参:./configure --with-openssl-dir=/usr/include/openssl - 别加
--without-openssl:这会让Swoole\Http\Client访问 HTTPS、WebSocket over TLS 全部失效
php --ri swoole 显示 supports 全是 disabled
扩展能加载,但关键功能不可用,本质是 ./configure 没启用对应模块,不是运行时开关问题。
-
socketsdisabled → 补--enable-sockets,否则Swoole\Coroutine\Socket初始化失败 -
openssldisabled → 补--enable-openssl,否则 TLS 握手直接报错 -
http2disabled → 补--enable-http2,否则$server->set(['http_compression' => true])不生效 -
mysqlnddisabled → 补--enable-mysqlnd,否则Swoole\Coroutine\MySQL报mysqlnd is not enabled - PHP 8.5 用户注意:
opcache.jit=call(默认值)与协程 Hook 冲突,需在php.ini中设为opcache.jit=off
Module 'swoole' already loaded 报错
不是扩展冲突,是 PHP 从多个位置重复加载了 swoole.so —— 宝塔旧版 loader、禾匠 swoole_loader_20_php72.so、手动编译的新版 so 文件混存,哪怕只启用了其中一个,残留的 extension= 行也会触发二次加载。
- 执行
php --ini列出所有配置路径,逐个检查:/etc/php.d/、/www/server/php/*/etc/php.d/、主php.ini,删掉所有重复的extension=swoole.so行 - 查清实际加载的是哪个文件:
php --ri swoole | grep "extension",输出类似extension: /usr/lib64/php/modules/swoole.so,这个路径才是真正在跑的 - 宝塔旧版常把
swoole.so写死在/usr/lib64/php/modules/,优先级高于你编译的新版(如no-debug-non-zts-20230831/),直接删旧文件:sudo rm /usr/lib64/php/modules/swoole.so - PHP 8.5 用户请改用
pecl install openswoole:Swoole 5.0+ 已不兼容 PHP 8.5,OpenSwoole 26.2.0 是目前唯一明确全兼容的发行版
最易被忽略的一点:phpEnv、Docker、宝塔多版本共存环境下,phpize 和 php-config 必须来自同一 PHP 实例,且 php-config --extension-dir 输出的目录,必须和 make install 实际写入的位置一致——差一个 ABI 后缀(比如 20190902 vs 20230831),扩展就永远加载失败。










