必须同时为CLI和FPM配置Swoole扩展:二者加载独立php.ini,仅改一个会导致Web端Class not found;需分别在两份配置末尾添加extension=swoole(PHP 8.0+)或extension=swoole.so,并重启FPM服务验证。

PHP-FPM 和 CLI 必须各自加载 Swoole 扩展
必须装,而且不能只装一个。Swoole 是扩展,不是全局服务;PHP-FPM 和 php CLI 是两个完全独立的进程,各自读各自的 php.ini,彼此不共享配置或已加载的扩展。
为什么改了 CLI 的 php.ini,网页里还是 Class not found
常见现象是:php -m | grep swoole 有输出,但 phpinfo() 页面里找不到 Swoole,或者 Web 请求报 Class 'Swoole\Http\Server' not found。这不是代码问题,而是 FPM 根本没加载扩展。
- CLI 加载的是
php --ini显示的 “Loaded Configuration File” 路径下的php.ini - FPM 加载的是 Nginx/Apache 实际调用的那个 PHP 版本对应的
php-fpm.conf或其包含的php.ini(宝塔中通常是/www/server/php/82/etc/php.ini) - 两者路径不同、内容独立,改错文件或只改一个,必然一半失效
怎么确认并同时配置 CLI 和 FPM 的 swoole 扩展
关键不是“装一次”,而是“配两处”。安装只需一次(pecl install swoole 或编译),但启用要分别写入两个 php.ini。
- 查 CLI 实际加载的配置:
php --ini | grep "Loaded Configuration File" - 查 FPM 实际加载的配置:宝塔用户直接看
/www/server/php/{版本号}/etc/php.ini;非宝塔环境可查php-fpm -t后的日志或ps aux | grep fpm看启动参数 - 两个
php.ini文件末尾都加同一行:extension=swoole(PHP 8.0+ 不写.so)或extension=swoole.so(源码编译时) - 改完 FPM 配置后,必须执行
bt restart php82(宝塔)或systemctl restart php*-fpm(非宝塔),仅重载配置不生效
验证必须分场景做,不能只跑命令行
只用 php -m 验证,等于只测了 CLI;Web 场景是否可用,得走真实 HTTP 请求路径。
立即学习“PHP免费学习笔记(深入)”;
- CLI 验证:
/www/server/php/82/bin/php --ri swoole(输出 enabled 即成功) - Web 验证:新建
info.php,内容为<?php phpinfo(); ?>,浏览器访问,搜索 “swoole” 看是否显示 loaded - 如果 CLI 成功但 Web 失败,99% 是 FPM 的
php.ini没加extension=swoole,或没重启服务



















