宝塔面板“安装Swoole”失败主因是PHP CLI与FPM环境不一致、phpize/php-config路径错误或依赖缺失;必须严格使用目标PHP版本的完整路径(如/www/server/php/81/bin/phpize)、同时配置CLI和FPM的php.ini添加extension=swoole.so并重启服务,且需检查openssl-devel等编译依赖及swoole_loader冲突。

宝塔面板里点“安装 Swoole”却一直失败,90% 不是网络卡顿或按钮坏了,而是底层路径、配置、依赖三处没对齐——尤其 PHP CLI 和 FPM 用的不是同一套环境,装一半就失效。
phpize 或 php-config 找不到或版本错位
这是最常卡住的第一步。宝塔多 PHP 版本共存时,phpize 和 php-config 必须严格来自你要装扩展的那个 PHP 子目录,不能只写 phpize 或 php-config-8.0。
- 先确认你项目实际用的 PHP 版本(比如右上角显示 PHP-80,但网站运行在
/www/server/php/81/):执行/www/server/php/81/bin/php -v - 检查工具是否存在:
ls /www/server/php/81/bin/phpize和ls /www/server/php/81/bin/php-config,缺一个就说明开发包没装全 - CentOS/RHEL 系统必须装
php-devel(注意版本号匹配,PHP 8.1 就装php81-devel);Ubuntu/Debian 装php8.1-dev - 如果
phpize报Cannot find autoconf,补装:yum install -y autoconf automake libtool(CentOS)或apt install autoconf automake libtool(Ubuntu)
编译成功但 php --ri swoole 报 not found
这说明 swoole.so 文件生成了,但 PHP 根本没加载它——大概率是只改了 FPM 的 php.ini,忘了 CLI 的,或者 extension_dir 路径不对。
- 查
swoole.so实际位置:ls -l /www/server/php/81/lib/php/extensions/no-debug-non-zts-20210902/swoole.so(版本号目录名随 PHP 版本变) - CLI 用的
php.ini是:/www/server/php/81/etc/php.ini(部分版本是/www/server/php/81/bin/php.ini),FPM 用的是:/www/server/php/81/etc/php.ini或/www/server/php/81/etc/php-fpm.d/www.conf里的php_admin_value[extension] - 两个文件末尾都加一行:
extension=swoole.so(PECL 安装新版可能用extension=swoole,无 .so 后缀) - 别信
php -m | grep swoole,它只看模块名列表;真正验证用:/www/server/php/81/bin/php --ri swoole
configure 阶段静默跳过 --enable-openssl 或 --enable-http2
Swoole 4+ 默认不启用加密和 HTTP/2 支持,但 WebSocket、HTTPS、gRPC 等功能一调就报错,比如 Call to undefined function swoole_http_server() 或连接被拒绝,根源常在这里。
立即学习“PHP免费学习笔记(深入)”;
-
./configure命令必须显式带上:--enable-openssl和--enable-http2 - 系统缺 OpenSSL 开发库会导致 configure 跳过
--enable-openssl:CentOS/RHEL 装openssl-devel,Ubuntu/Debian 装libssl-dev - PHP 8.5+ 还必须加
--enable-coroutine,否则Swoole\Coroutine::sleep()直接报not available - 编译完用
ldd /www/server/php/81/lib/php/extensions/.../swoole.so | grep ssl确认是否链接了libssl.so
装完 Class 'swoole_websocket_server' not found
这不是扩展没装上,而是运行时冲突或禁用函数拦截。常见于禾匠系加密项目(如榜店商城 v4)已加载 swoole_loader,再装原生 swoole.so 就会互斥。
- 查是否已加载 loader:
php -m | grep loader,若输出swoole_loader,就不能再加extension=swoole.so - loader 和 swoole.so 共存会报:
Module 'swoole' already loaded或undefined symbol: sw_zend_register_internal_class_ex - 检查
disable_functions是否禁用了proc_open、shell_exec等——Swoole 启动协程服务时可能依赖它们 - PHP 7.4+ 的 NTS 版本要特别注意 loader 文件名后缀:
swoole_loader74_nzts_x64.so,错一个字母都不行
真正麻烦的不是编译本身,而是 CLI 和 FPM 两套环境各自独立,改一处漏一处;更隐蔽的是 loader 冲突和 OpenSSL 静默跳过——这些不会报红字错误,但一跑业务就崩。



















