今天测试了一下协程效果,把依赖都更新为最新版(workerman/webman-framework ^2.1、webman/database:~2.1、webman/think-orm:~2.1),然后修改process.php的'eventLoop' => Workerman\Events\Fiber::class,环境是windows,测试代码:
public function index(): Response
{
$value = \think\facade\Db::query('SELECT NOW() as now, sleep(5)');
return json($value); // [{"now":"2025-02-06 23:41:03","0":"2025-02-06 23:41:03"}]
}
这里用sleep模拟了慢查询,按原想法应该:开启了协程,单进程遇IO阻塞也可以同时处理多个请求,但实际测试执行到这里阻塞时,其他请求也是阻塞的(哪怕什么都不处理),不知是我对协程理解的有问题还是代码的问题呢?
仔细看下文档;官方文档的解释
嗯,这个我看了,而且官方文档里说:
webman v2.1 已经提供了以下组件,它们都集成了连接池,支持在协程和非协程环境下使用
webman/database (Laravel系)
webman/redis (Laravel系)
webman/cache (Laravel系)
webman/think-orm (ThinkPHP系)
webman/think-cache (ThinkPHP系)
我以为这些都已经适配好了各协程驱动,难道只能Swoole和Swow使用IO协程么?那Fiber只能使用Timer定时器这些有限的协程功能?请赐教~
Fiber 你去看文档,阻塞下还是同步的操作的。你去看下文档;我求求你啊。
好的,谢谢