跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

phpEnv安装swoole扩展 phpEnv Windows下swoole配置

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

相关文章