phpEnv下安装Swoole需手动匹配DLL:根据php -v和php --ri openssl确认PHP版本、TS/NTS及VC编译器,下载对应php_swoole.dll放入ext目录,在CLI和Web端php.ini中均添加extension=php_swoole.dll并重启服务,最后显式启用协程。
php
Env 下怎么装 Swoole 扩展
phpEnv 是 Windows 下的多版本 PHP 环境管理工具,它本身不提供图形界面或一键扩展安装,所有扩展必须手动匹配、复制并配置。你不能用
(Windows 没有 phpize 和 pecl 编译链),也不能指望 phpEnv 自动处理 TS/NTS 或 VC 版本对齐。
核心动作只有三步:找对 DLL → 放对目录 → 改对
。
先运行
和
(看是否启用 OpenSSL,影响 Swoole 功能)确认当前激活的 PHP 版本(如 8.2)、线程安全模式(
就是 TS)、VC 编译器版本(如 VC17)
去
https://www.php.cn/link/948d25d346008436180931cd87fb5cf1
下载对应版本的 ZIP 包(例如
)
解压后取出
,放进当前 phpEnv 管理的 PHP 版本的
目录下(路径类似
)
用 phpEnv 切换到该版本后,执行
找到对应
路径,编辑它,在末尾加一行:
为什么 extension=
swoole
不生效
在 phpEnv 环境里写
几乎必然失败——这不是拼写问题,而是 Windows 下 Swoole 官方发布的 DLL 文件名固定为
,不是
,PHP 加载时会直接报
。
常见错误现象:
立即学习
“
PHP免费学习笔记(深入)
”;
无输出
报错
Web 页面中
里完全找不到 Swoole 模块区块
检查点:
确认
是当前 phpEnv 激活版本实际读取的那个(用
查 Loaded Configuration File)
确认 DLL 文件权限正常(右键 → 属性 → 安全 → Users 有读取权限)
确认没同时存在多个
行指向不同名字(比如既有
又有
)
phpEnv 中 CLI 和 Web(Apache/Nginx)用的不是同一个 php.ini
这是最容易被忽略的坑:phpEnv 切换的是 CLI 环境,但 Apache 或 Nginx 启动时加载的是自己绑定的 PHP 的
,两者可能完全不同。
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
例如:
你在命令行跑
成功了,但浏览器访问
却没有 Swoole
这是因为 Apache 使用的是
(或你手动指定的路径),而 CLI 用的是
解决办法:
用
页面里的 “Loaded Configuration File” 明确看到 Web 端实际加载的是哪个
在这个文件里也加上
重启 Apache/Nginx 服务(不是重载,是彻底 stop 再 start)
装完 swoole.so 还是同步阻塞?协程没生效
即使
显示一切正常,
、
、MySQLi 连接等默认仍是同步行为——Swoole 的协程 Hook 是显式开启的,不是安装即启用。
必须在代码最开头(或框架入口)调用:
或者在
中加配置项(仅限 Swoole ≥ 4.5.0):
注意:
如果用了 Laravel/Symfony 等框架,
必须在框架初始化前调用,否则会被覆盖
开启后,原生函数如
会变成协程让出,但
仍可能阻塞,建议改用
某些扩展(如 Xdebug)与协程 Hook 冲突,开启后报错需临时禁用
Swoole 在 phpEnv 下真正可用,关键不在“装上”,而在“对齐三个版本号(PHP 主版本 + TS/NTS + VC)”、“写对 DLL 文件名”、“配对两份 php.ini”、“显式启用协程”。漏掉任意一个,都会表现为“看似装了,实则白装”。
pecl installphp.iniphp -vphp --ri opensslThread Safety => enabledswoole-5.1.3-8.2-ts-vs17-x64.zipphp_swoole.dllext/C:\phpenv\php\php-8.2.12-ts\ext\phpenv which phpphp.iniextension=php_swoole.dllextension=swoolephp_swoole.dllswoole.dllPHP Warning: Unable to load dynamic library 'swoole'php -m | findstr swoolephp --ri swooleExtension 'swoole' not presentphpinfo()php.iniphp --iniextension=...swoolephp_swoolephp.iniphp --ri swoolephpinfo()C:\phpenv\apache\php.iniC:\phpenv\php\php-8.2.12-ts\php.iniphpinfo()php.iniextension=php_swoole.dllphp --ri swoolefile_get_contents()cURLSwoole\Runtime::enableCoroutine(true);
php.iniswoole.enable_coroutine = 1
swoole.display_errors = 1
enableCoroutinesleep()usleep(1000)Swoole\Coroutine::sleep(0.001)