swoole 5.0 要求 php ≥ 8.0,phpenv 中需先安装并全局切换至 php 8.0+ 版本,使用对应 phpize/php-config 源码编译安装,手动配置 php.ini 加载 swoole.so,并显式启动服务或协程调度器才能启用协程等功能。

swoole 在 phpEnv 中默认不启用,且 phpEnv 的 PHP 版本若低于 8.0,swoole 5.0 就根本无法编译安装——这是最常被忽略的前提。
确认 phpEnv 当前 PHP 版本是否支持 Swoole 5.0
Swoole 5.0 要求 PHP ≥ 8.0,而 phpEnv 默认提供的 PHP 7.4/7.3 等版本会直接在 ./configure 阶段报错:configure: error: Swoole 5.x requires PHP version >= 8.0。
- 执行
/phpenv/versions/8.0.30/bin/php -v(路径需按你实际安装的 PHP 8+ 版本调整)确认 CLI 版本 - 若只有 7.x,必须先用 phpEnv 安装 PHP 8.0+:
phpenv install 8.0.30,再phpenv global 8.0.30 - phpEnv 的
php-config和phpize工具位于对应版本 bin 目录下,不可混用,例如:/phpenv/versions/8.0.30/bin/phpize
用 PECL 安装失败时,必须切到源码编译
phpEnv 环境下 pecl install swoole 常因路径隔离失败,报错如:ERROR: failed to mkdir /tmp/pear/install 或找不到 php-config。此时应放弃 PECL,改用源码方式:
- 下载匹配版本源码:
wget https://github.com/swoole/swoole-src/archive/refs/tags/v5.0.3.tar.gz(Swoole 5.0.3 是当前稳定版) - 解压后进入目录,用 phpEnv 对应版本的工具链:
/phpenv/versions/8.0.30/bin/phpize -
./configure --with-php-config=/phpenv/versions/8.0.30/bin/php-config --enable-openssl --enable-http2(--enable-openssl强烈建议启用,否则 WebSocket Secure 会失败) -
make && make install成功后,输出类似:Installing shared extensions: /phpenv/versions/8.0.30/lib/php/extensions/no-debug-non-zts-20200930/
phpEnv 下 php.ini 路径和加载配置易错点
phpEnv 不会自动修改任何 php.ini,且其配置文件位置与系统默认完全不同——它通常在:/phpenv/versions/8.0.30/etc/php.ini,而不是 /etc/php/ 或 /usr/local/lib/。
- 确认生效的配置文件路径:
/phpenv/versions/8.0.30/bin/php --ini,看 “Loaded Configuration File” 行 - 在该
php.ini末尾添加:extension=swoole.so(不是extension="swoole.so",引号在 phpEnv 下某些版本会触发解析错误) - 不要加
enable-swoole或其他伪配置项——Swoole 5.0 不识别这些,只会报Unknown configuration directive - 验证:
/phpenv/versions/8.0.30/bin/php --ri swoole,输出中必须含version => 5.0.3和coroutine => enabled
Swoole 5.0 协程功能默认未激活,必须显式启用
装完 swoole.so 只是加载了扩展,但协程 Hook、异步 I/O 等核心能力默认关闭。PHP 进程启动时不会自动开启事件循环,go() 也不会生效,除非你主动运行 Swoole 服务或手动启动协程调度器。
- CLI 模式下测试协程:
/phpenv/versions/8.0.30/bin/php -r "go(function() { co::sleep(0.1); echo 'done'; });"—— 若无输出或报Call to undefined function go(),说明扩展未加载或 PHP 版本不匹配 - Web SAPI(如 Apache/FPM)中
go()永远不可用,Swoole 5.0 已彻底移除所有swoole_*前缀函数,只保留go()、co::等现代接口 - 真正启用高性能通信,必须写一个
swoole_http_server或swoole_websocket_server实例并调用->start(),否则只是“空载扩展”
最关键的不是“能不能装上”,而是“装完之后 PHP 进程是否真进入了 Swoole 的事件循环”。很多用户卡在 php -m | grep swoole 显示成功,却始终无法触发 go(),问题几乎都出在 PHP 版本错配或 php.ini 加载路径不对——这两个点必须逐条手敲命令验证,不能依赖经验猜测。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











