phpenv不提供扩展安装功能,需为每个PHP版本单独用对应phpize和php-config编译Swoole,并在该版本php.ini中以绝对路径添加extension=...,最后用php -m和php --ri swoole验证。

phpenv 本身不提供扩展安装功能,它只是 PHP 版本管理工具(类似 rbenv 或 pyenv),不负责编译或启用扩展。你要装 Swoole,得在 phpenv 管理的每个 PHP 版本下单独编译安装,并确保 php.ini 正确指向该版本的扩展目录。
确认当前 phpenv 管理的 PHP 版本和路径
先搞清你正在用哪个 PHP 版本,以及它的实际安装位置:
- 运行
phpenv version查看当前激活版本(如7.4.33) - 运行
which php,输出类似/home/you/.phpenv/versions/7.4.33/bin/php - 对应
phpize和php-config路径就是:/home/you/.phpenv/versions/7.4.33/bin/phpize和/home/you/.phpenv/versions/7.4.33/bin/php-config -
php --ini显示加载的php.ini路径(通常是/home/you/.phpenv/versions/7.4.33/etc/php.ini)
⚠️ 容易踩的坑:直接用系统全局的 phpize 或 php-config,会导致扩展编译进错 PHP 版本,加载时提示 undefined symbol 或直接失败。
用 phpize + php-config 编译安装 Swoole
这是最稳妥、phpenv 用户必须走的路。PECL 在 phpenv 下常因 pear 路径混乱而失败,不推荐。
立即学习“PHP免费学习笔记(深入)”;
- 下载源码(以 Swoole v5.1.3 为例):
wget https://github.com/swoole/swoole-src/archive/refs/tags/v5.1.3.tar.gz - 解压并进入:
tar -xzf v5.1.3.tar.gz && cd swoole-src-5.1.3 - 用当前版本的工具生成配置:
/home/you/.phpenv/versions/7.4.33/bin/phpize - 配置编译参数(关键!指定正确
php-config):./configure --with-php-config=/home/you/.phpenv/versions/7.4.33/bin/php-config --enable-openssl --enable-http2 - 编译安装:
make && make install - 安装成功后会输出类似:
Installing shared extensions: /home/you/.phpenv/versions/7.4.33/lib/php/extensions/no-debug-non-zts-20190902/—— 记住这个路径
然后编辑该版本的 php.ini(即 php --ini 显示的那个),末尾加一行:
extension=/home/you/.phpenv/versions/7.4.33/lib/php/extensions/no-debug-non-zts-20190902/swoole.so
注意:不要写 extension=swoole(没后缀、没路径),否则 PHP 找不到文件;也不要写相对路径,phpenv 下路径必须绝对。
验证是否加载成功 & 常见报错
执行以下命令检查:
-
php -m | grep swoole—— 应输出swoole -
php --ri swoole—— 应显示版本、协程支持状态等信息 - 如果报
PHP Warning: PHP Startup: Unable to load dynamic library 'swoole.so',90% 是路径写错或.so文件不存在于该路径 - 如果报
undefined symbol: php_pcre_exec,说明编译时用了错误版本的php-config,导致 ABI 不匹配 - 如果
php --ri swoole显示coroutine => disabled,说明编译时没加--enable-coroutine(Swoole 5+ 默认启用,但旧版需手动开)
每次切换 phpenv local 或 phpenv global 后,都得为新版本重复上述编译 + 配置步骤 —— phpenv 不自动同步扩展。
为什么不用 pecl install swoole?
因为 pecl 依赖当前 php 的 pear 环境,而 phpenv 下各版本的 pear 是隔离的,且默认未初始化。强行运行 pecl install swoole 往往会:
- 找不到
php-config(路径不在$PATH) - 写入系统级
php.ini,而非当前phpenv版本的配置 - 编译出的
swoole.so放到错误扩展目录(比如系统/usr/lib/php/...)
除非你为每个 phpenv 版本手动运行 phpenv rehash && pear config-set php_ini $(php --ini | head -n1 | cut -d' ' -f5),否则别碰 pecl。
真正麻烦的地方不在编译本身,而在于每个 PHP 版本都要独立处理一遍路径、配置、重启(CLI 模式无需重启服务,但 Web 服务器如 Apache/Nginx 要 reload 才能反映新 PHP 配置)。漏掉一个环节,php --ri swoole 就永远不显示协程支持。



















