必须同时向CLI和FPM的php.ini添加extension=swoole.so并重启PHP服务,因二者配置独立;需确认swoole.so路径正确、权限合适,且无重复加载或扩展冲突。

不是没重启,而是没 reload 对的配置文件,或者根本没加载到正确的 so 文件。
确认 CLI 和 FPM 用的是同一个 php.ini?
宝塔、多版本 PHP、自定义编译环境里,php -m 看到的扩展和 Web 请求实际加载的扩展经常不一致——因为它们走的是两套配置:
-
php --ini查 CLI 的配置路径(通常是/www/server/php/XX/etc/php-cli.ini) -
php-fpm -i | grep "Loaded Configuration File"查 FPM 的配置路径(通常是/www/server/php/XX/etc/php.ini) - 两个文件都得手动加
extension=swoole.so,缺一不可 - 别信宝塔“已安装”提示,它只管扩展管理界面,不校验 ini 是否真实生效
swoole.so 文件路径写对了吗?
直接写 extension=swoole.so 是最稳妥的,但前提是 so 文件在 PHP 扩展默认搜索路径里。否则必须写绝对路径:
- 先确认 so 文件真实位置:
find /www/server/php -name "swoole.so" 2>/dev/null - 常见路径是
/www/server/php/74/lib/php/extensions/no-debug-non-zts-20190902/swoole.so(PHP 7.4)或...no-debug-zts-20200930/...(PHP 8.0+) - 如果写绝对路径,确保权限为
644,且属主是运行 php-fpm 的用户(如www) - 别复制粘贴错文件名,比如把
swoole_loader74.so当成swoole.so加载
重启了 php-fpm,但进程没真正 reload?
“重启”不等于“重载”,尤其在宝塔或 systemd 下容易误操作:
立即学习“PHP免费学习笔记(深入)”;
- 宝塔面板点“重载服务” ≠ 重启 php-fpm 进程;它有时只 reload 配置,不重建进程,旧进程仍跑着旧模块
- 务必执行:
pkill -f "php-fpm.*74" && /www/server/php/74/sbin/php-fpm(替换为你实际的 PHP 版本号) - 验证是否生效:
php-fpm -v和php -r "echo extension_loaded('swoole') ? 'yes' : 'no';"必须都返回 yes - Web 环境验证:新建
info.php,内容<?php phpinfo(); ?>,浏览器打开后搜索swoole,看有没有完整模块信息
opcache 或扩展冲突导致“加载了却没效果”
即使 php -m 显示 swoole,也可能因缓存或顺序问题被跳过:
- opcache 缓存了旧的 opcode,导致新扩展逻辑不触发:
php -r "opcache_reset();"或重启前清空 opcache - 检查是否有重复加载:
grep -r "swoole.so" /www/server/php/,删掉多个extension=行(尤其是php.d/目录下自动加载的) - 某些加密扩展(如
swoole_loader)和原生swoole.so不能共存,会报Module 'swoole' already loaded - 扩展加载顺序有影响:fileinfo、curl、openssl 等依赖模块需在 swoole 前加载,否则 swoole 初始化失败静默降级
最容易被忽略的是:FPM 子进程继承了父进程的模块状态,哪怕你改了 ini、重启了 master,已有 worker 还在跑旧代码——所以验证时一定要等几秒再测,或用 kill -USR2 强制所有 worker 退出重建。



















