composer 无法直接安装 swoole 扩展,因其是需编译的 c 扩展;须用 pecl install swoole 或源码编译,并配置 php.ini 启用 extension=swoole.so,再通过 php -m 或 php --ri swoole 验证。

Composer 安装 Swoole 扩展失败:不是装包,是编译扩展
Composer 不能直接安装 swoole 扩展——它不是纯 PHP 包,而是需要编译的 C 扩展。你执行 composer require swoole 只会装一个空壳(ext-swoole 的 stub 包),运行时仍会报 Class 'Swoole\Server' not found。
- 真正要做的,是用
pecl install swoole或源码编译,再确保extension=swoole.so写进php.ini - 确认生效:运行
php -m | grep swoole或php --ri swoole - 常见错误:
configure: error: Please specify the install prefix of openssl→ 缺少 OpenSSL 开发头文件,Ubuntu/Debian 装libssl-dev,CentOS 装openssl-devel - PHP 版本必须匹配:PHP 8.2 不能用为 PHP 8.1 编译的
swoole.so,否则启动直接 Segfault
composer.json 里加 "ext-swoole": "*" 是干啥的?
这只是声明依赖,告诉 Composer:“我代码要用 Swoole,你检查下当前环境有没有装好”。它不触发安装,也不下载二进制,只在 composer install 时做兼容性校验。
- 写法示例:
"require": { "ext-swoole": "*" } - 没装扩展时会报错:
The requested PHP extension ext-swoole * is missing from your system - 它不解决“怎么装”,只解决“装没装对”——适合 CI 环境卡住非法部署
- 注意:这个检查默认只在
composer install时触发,composer update不强制校验
想用 Swoole 协程能力,光装扩展还不够
装完 swoole 扩展只是第一步。协程不是默认开启的魔法开关,很多行为取决于你是否在协程上下文里运行,以及是否用了协程版 API。
- 必须用协程风格启动服务:比如
Swoole\Coroutine\run()或Swoole\Http\Server配合set(['hook_flags' => SWOOLE_HOOK_ALL]) - 普通
file_get_contents()、curl_exec()在协程里仍是阻塞的,得换Swoole\Coroutine\Http\Client或启用SWOOLE_HOOK_CURL - MySQL/PDO 默认不协程化,要用
Swoole\Coroutine\Mysql或co::sleep()替代sleep(),否则协程调度器被卡死 - 常见坑:在
foreach里直接 new 协程但没go(),或者go(function () { ... })里用了未 hook 的函数,导致整个协程挂起
本地开发 vs Docker 部署:Swoole 安装路径差异大
Mac M1/M2、Ubuntu WSL、Alpine 容器里的编译方式和依赖完全不同,硬套教程容易卡在 configure 阶段。
- Mac(Homebrew):
brew install php@8.2后,用pecl install swoole;若报zts错误,加--without-zts - Alpine(Docker):
apk add --no-cache $PHPIZE_DEPS linux-headers curl-dev openssl-dev,再pecl install swoole,最后docker-php-ext-enable swoole - Windows?别折腾了,Swoole 官方不支持 Windows,WSL 是唯一靠谱选项
- 最容易忽略的一点:Docker 中 PHP-FPM 和 CLI 的
php.ini是两份,php -v显示有 swoole,但php-fpm启动报错,大概率是 FPM 的 ini 没加extension=swoole.so
事情说清了就结束。Swoole 不是 composer require 一下就能跑的库,它是运行时底座,装错位置、版本不对、ini 没加载、hook 没开——任何一个环节断掉,协程就静默失效。










