swoole扩展安装成功但调用报错,本质是环境隔离或配置错位:需检查disable_functions是否禁用swoole_version、swoole.use_shortname是否为on、cli与fpm php.ini是否均正确配置extension=swoole.so、swoole版本是否≥4.7(coroutine\run)、php 8.5+是否编译启用--enable-coroutine,以及避免重复加载模块。

Swoole 扩展安装成功但代码里调用报错,常见情况不是“没装上”,而是“装上了但用不了”——函数、类、常量在运行时不可见,本质是环境隔离或配置错位导致的符号缺失。
php --ri swoole 能显示但 swoole_version() 报 Call to undefined function
这说明扩展已加载,但部分功能被禁用或 PHP 配置限制了函数暴露:
- 检查
disable_functions配置项是否禁用了swoole_version(常见于安全加固环境),执行php -i | grep disable_functions查看; - 确认
swoole.use_shortname是否为On(默认开启),若设为Off,则swoole_version()不可用,必须改用\Swoole\version(); - CLI 和 Web(FPM)使用不同
php.ini,php --ri swoole成功不代表 FPM 环境也启用了扩展,需分别验证:/www/server/php/80/bin/php --ri swoole(CLI)和phpinfo()页面中查看(FPM);
Swoole\Coroutine\run() 报 Call to undefined function
这个函数从 Swoole 4.7 开始引入,低版本(如 4.5 或 2.x)根本不存在:
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
- 运行
php --ri swoole,确认输出中version≥ 4.7; - 宝塔用户尤其注意:软件商店默认可能装的是旧版,需手动卸载后重装新版(如 4.8+),不能只点“升级”;
- 若版本达标仍报错,检查是否在协程上下文外调用 ——
Swoole\Coroutine\run()必须在顶层直接调用,不能包裹在其他函数或类方法中(否则闭包作用域丢失);
new Swoole\Server() 或 new Swoole\Http\Server() 报 Class not found
这不是扩展没加载,而是命名空间或类加载机制问题:
- 确认
use_namespace配置为1(php --ri swoole输出中可见),否则必须用完整命名空间:\Swoole\Server,而非Swoole\Server; - 若使用短名(如
swoole_http_server),需确保swoole.use_shortname = On,且未被disable_functions屏蔽; - PHP 8.5+ 若编译时未加
--enable-coroutine,会导致Swoole\Coroutine相关类不可用,即使php --ri swoole显示正常;
扩展加载提示 Module 'swoole' already loaded
这是重复加载警告,虽不中断执行,但暴露了配置冗余:
- 搜索所有
php.ini文件(CLI 和 FPM 各一份),执行php --ini和phpinfo()分别确认路径,删掉重复的extension=swoole.so行; - 宝塔用户注意:扩展可能被“软件商店”自动写入一次,又被你手动加了一次,常见于 /www/server/php/80/etc/php.ini 和 /www/server/php/80/bin/php.ini 同时存在;
- 重启 PHP 服务(非重载)才能清空已加载模块状态,仅 reload 不会清除重复加载痕迹;
真正难排查的点往往不在代码本身,而在 CLI/FPM 的 php.ini 差异、disable_functions 列表、以及 Swoole 编译时漏掉的 --enable-openssl 或 --enable-coroutine 参数 —— 这些不会让 php --ri swoole 失败,却会让具体函数或类静默不可用。










