workerman本身不依赖协程,所谓“协程版”实为基于swoole扩展的swoole-worker,而swoole官方不支持windows原生运行,因此无法在windows和linux上统一配置协程;跨平台协程唯一可行方案是wsl2或docker容器。

Workerman协程在Windows和Linux上无法真正统一配置,因为协程支持依赖Swoole扩展,而Swoole官方【不支持Windows原生运行】。你不能在Windows上直接启用Swoole协程,也不能用同一套代码在两个平台无缝切换协程模式。
先确认你的Workerman是否真用上了协程
Workerman本身是基于PHP-CLI的多进程/事件驱动框架,默认不依赖协程。所谓“Workerman协程”,实际是指配合Swoole扩展启用的协程版Worker(即swoole-worker),它与标准Workerman是两套不同底层机制。
检查你项目中是否引入了swoole-worker:打开composer.json,搜索swoole-worker或swoole;若只有workerman/workerman,则当前根本没走协程路径,所谓“跨平台协程配置”从源头就不成立。
Windows下想跑协程的唯一可行路径
方法一:用WSL2(推荐)
在Windows 10/11中启用WSL2,安装Ubuntu子系统,然后在子系统内完整部署Linux环境:安装PHP>=7.4、swoole扩展、composer,再require swoole-worker。此时你写的协程代码(如Swoole\Coroutine::create、go())才能真实执行,且行为与生产Linux服务器一致。
方法二:Docker Desktop + Linux容器
写好Dockerfile,基础镜像选php:8.1-cli,RUN pecl install swoole && docker-php-ext-enable swoole,COPY项目代码,CMD ["php", "start.php", "start"]。本地Windows只负责构建和启动容器,协程运行完全隔离在Linux容器内。
注意:Cygwin或BashOnWindows不支持Swoole,强行安装会编译失败或运行崩溃。
Linux服务器上启用协程的硬性条件
第一步:确认PHP版本≥7.4且已安装swoole扩展
第二步:检查swoole是否启用协程支持——运行php --ri swoole,输出中必须包含coroutine => enabled和hooks => standard hooks,缺一不可。
第三步:在启动脚本中显式启用协程调度器
在start.php顶部添加:Swoole\Runtime::enableCoroutine(true);。这一步不可省略,否则即使扩展装了,协程I/O(如Co\Http\Client)也不会自动挂起,仍会阻塞进程。
第四步:改写Worker逻辑,用协程API替代同步调用
例如把file_get_contents('http://api.com')换成(new Co\Http\Client)->get('/'),把mysqli_query()换成Co\Mysql->query()。同步函数不会自动协程化,必须主动替换。
绝对不能做的跨平台“兼容写法”
不要试图用if (PHP_OS_FAMILY === 'Windows')分支去切换协程开关——Swoole在Windows下根本不存在,class_exists('Swoole\Coroutine')永远返回false,任何基于此的条件判断都会导致Linux端协程失效或Windows端报致命错误。
不要在composer.json里同时require workerman/workerman和swoole-worker——它们的Autoloader冲突,use Workerman\Worker在swoole-worker中已被重定义,会导致Class Worker not found。











