运行 php --ri swoole 可快速获取实际加载的 Swoole 版本、编译选项(如 openssl、http2、async_redis、mysql 支持状态)及启用特性,避免 phpinfo() 缓存误导;若报错“Extension 'swoole' not found”则未安装或未启用扩展。

怎么快速确认当前 PHP 环境里 Swoole 版本和编译选项
直接运行 php --ri swoole,它会输出完整模块信息,包括版本号、启用的特性(如 openssl、http2、curl)、是否支持 async_redis 等。别只看 phpinfo() 页面——那里可能缓存旧配置,而 --ri 读的是实际加载的模块。
常见错误现象:php --ri swoole 报错 “Extension 'swoole' not found”,说明扩展根本没装或没启用;或者输出里 SWOOLE_VERSION 是 4.8.13,但代码里用了 Swoole\Coroutine::listCoroutines()(5.0+ 才有),就会报 Call to undefined method。
- 检查前先确认 PHP CLI 和 Web Server(如 nginx + php-fpm)用的是同一个
php.ini,否则 CLI 能跑,Web 下就报错 -
swoole.version字段显示的是运行时版本,不是composer show swoole/ide-helper里的 SDK 版本 - 如果输出里
async_redis => enabled是disabled,哪怕你装了 redis 扩展,Swoole\Coroutine\Redis也用不了
composer require 时为什么提示 “swoole ^5.0 requires php >= 8.0.0”
这是 Composer 在做依赖约束校验,不是 Swoole 自身限制——Swoole 扩展本身支持 PHP 7.4+(4.x 系列),但部分官方组件(如 swoole/framework、swoole/ide-helper)已放弃低版本 PHP 兼容。重点看你要装的是扩展还是纯 PHP 包。
使用场景:你在 Laravel 项目里执行 composer require swoole/framework,结果失败。其实你根本不需要这个包——Laravel 的 Swoole 支持靠 laravel-swoole 或 hyperf/swoole 这类适配器,不是靠官方框架包。
- 装扩展:用 pecl(
pecl install swoole)或编译安装,跟 Composer 无关 - 装 SDK/IDE 辅助:查清目标包的
composer.json里require.php字段,比如swoole/ide-helperv4.x 支持 PHP 7.2+,v5.x 起强制要 PHP 8.0+ - 混淆点:很多人把
ext-swoole(PHP 扩展)和swoole/swoole(已废弃的旧 Composer 包)搞混,后者早在 2019 年就标记为 abandoned
PHP 8.1 下 Swoole 4.8 编译失败:configure: error: off_t undefined; check your library configuration
这是 GCC 编译器在 PHP 8.1+ 环境下找不到 off_t 类型定义导致的,本质是系统头文件缺失或顺序问题,不是 Swoole 代码 bug。Swoole 4.8 是最后一个支持 PHP 7.4–8.1 的稳定版,但它对新 glibc 和新编译器更敏感。
实操建议:优先升级到 Swoole 5.0+(已修复),但如果必须用 4.8,按以下顺序处理:
- 确保安装了
glibc-devel(CentOS/RHEL)或libc6-dev(Ubuntu/Debian) - 编译前加环境变量:
CPPFLAGS="-D_GNU_SOURCE" ./configure --enable-openssl --enable-http2 - 避免用
phpize自动生成 configure——它可能漏掉关键宏定义,改用源码根目录下的build.sh(如有)或手动运行./configure - 若仍失败,降级 GCC 到 11.x(GCC 12+ 在某些发行版上有兼容问题)
判断 Swoole 是否支持协程 MySQL:$mysql = new Swoole\Coroutine\MySQL() 报错 Class not found
不是 PHP 版本或 Swoole 版本不够,而是扩展编译时没打开 MySQL 协程支持。Swoole 默认不内置 MySQL 客户端,它依赖系统 libmysqlclient 或 mariadb-client 开发包,并在 configure 阶段检测。
验证方式:运行 php --ri swoole,搜索输出中是否有 mysql => enabled。没有就说明编译时跳过了。
- 重装前先装系统依赖:
apt install libmysqlclient-dev(Ubuntu)或yum install mysql-devel(CentOS) - configure 时显式开启:
./configure --enable-mysqlnd --with-mysql-config=/usr/bin/mysql_config(路径用which mysql_config确认) - 注意:Swoole 5.0+ 已弃用
Swoole\Coroutine\MySQL,改用Swoole\Coroutine\Mysql(首字母大写),大小写错也会报 Class not found - 即使编译成功,如果 PHP 运行时没加载
mysqli或pdo_mysql扩展,Swoole\Coroutine\Mysql的某些方法(如getServerInfo())可能返回空或异常
最常被忽略的一点:Swoole 的“支持”只代表扩展能加载、类存在,不代表生产可用——比如 Swoole\Coroutine\Mysql 在连接池满、超时设置不合理、或 MySQL 服务端 wait_timeout 太短时,会静默断连,日志里只留下 SQLSTATE[HY000]: General error,得靠 onClose 回调和连接健康检查来兜底。










