php 8.3 必须匹配 swoole 5.1.x(如 5.1.1),swoole 4.8.13 不支持 php 8.3;需用 pecl install swoole 安装并确认 php-config --version 与 php -v 一致,fpm 模式需手动配置 extension=swoole.so,且必须调用 swoole\runtime::enablecoroutine() 启用协程 hook。

确认 PHP 8.3 和 Swoole 版本是否匹配
Swoole 5.x 是目前唯一正式支持 PHP 8.3 的主线版本,PHP 8.3 + 必须用 swoole 5.1.x(如 5.1.1);swoole 4.8.13 是最后一个支持 PHP 7.4 的稳定版,不能用于 PHP 8.3。装错版本会导致 PHP Warning: Module 'swoole' already loaded 或直接不加载。
执行以下命令核对实际环境:
php -v php-config --version pecl list | grep swoole
注意:php-config --version 输出的是编译时的 PHP 主版本,比 php -v 更可靠——尤其当你系统里有多个 PHP 版本时。
Linux/macOS 下用 pecl 安装最稳,但得先配好开发依赖
pecl 能自动调用当前 PHP 对应的 phpize 和 php-config,避免手动编译时路径错乱。但它依赖系统级开发包:
- Ubuntu/Debian:
sudo apt install php-dev(不是php8.3-dev,新版包名已统一) - CentOS/RHEL/AlmaLinux:
sudo dnf install php-devel - macOS(Homebrew):
brew install pcre2,否则安装时会报fatal error: 'pcre2.h' file not found;补救方式是手动软链或复制头文件:cp /opt/homebrew/Cellar/pcre2/*/include/pcre2.h /opt/homebrew/Cellar/php@8.3/*/include/php/ext/pcre/
然后执行:
pecl install swoole
过程中会提示启用哪些特性,默认回车即可;若需异步 Redis、SSL、cURL 等能力,可输入 yes。成功后,extension=swoole.so 通常已自动写入 /etc/php/*/cli/conf.d/20-swoole.ini(CLI 模式),但 FPM 模式可能没写,需手动检查 /etc/php/*/fpm/conf.d/ 下是否有同名文件,没有就加。
Windows 下只能用预编译 DLL,TS/NTS 和 VC 版本必须严丝合缝
Windows 的 PHP 不提供 phpize,也不能用 pecl 编译源码。你必须去官方镜像(如 php.net 的扩展分发页)下载匹配的 .dll 文件。
关键三项必须一致:
-
Thread Safety:查phpinfo()里 “Thread Safety” 行,是enabled(TS)还是disabled(NTS) -
VC 版本:PHP 8.3 用 VC17,PHP 8.2 用 VC16,错一个就报PHP Startup: Unable to load dynamic library 'swoole' -
架构:x64 还是 x86,和你的 PHP 一致
下载后的 DLL 文件名类似 php_swoole-5.1.1-8.3-ts-vs17-x64.dll,重命名为 php_swoole.dll,放进 PHP 的 ext/ 目录,再在 php.ini 里加一行:extension=php_swoole.dll。
装完不等于能用协程,必须显式开启 Hook
即使 php --ri swoole 显示已加载,file_get_contents、cURL、MySQLi 等默认仍是同步阻塞——这是新手最容易忽略的点。
要让协程真正接管 I/O,必须在脚本开头调用:
Swoole\Runtime::enableCoroutine(true);
或者更细粒度地启用特定模块:
Swoole\Runtime::enableCoroutine(SWOOLE_HOOK_ALL);
常见遗漏场景:
- 在 ThinkPHP/Swoft/Hyperf 等框架中,这个调用通常由框架完成,但自建脚本必须自己加
- FPM 模式下无法启用协程 Hook,只支持 CLI 模式
- 启用后若遇到
Segmentation fault,可能是某些扩展(如 Xdebug、Xhprof)不兼容,需临时禁用测试
验证是否生效:写个 go(function () { co::sleep(0.5); echo "done"; });,如果立刻输出“done”,说明协程调度器已跑起来;如果卡住半秒才输出,说明 Hook 没启成功。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











