请问webman使用协程查询数据库时的一个问题

深林孤鹰

今天测试了一下协程效果,把依赖都更新为最新版(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阻塞也可以同时处理多个请求,但实际测试执行到这里阻塞时,其他请求也是阻塞的(哪怕什么都不处理),不知是我对协程理解的有问题还是代码的问题呢?

237 1 0
1个回答

故人重来

仔细看下文档;官方文档的解释

  • 但Fiber无法像Swoole和Swow那样自动协程化,遇到PHP自带的阻塞函数时会阻塞整个进程,并不会发生协程切换
  • 当使用Fiber/Select/Event驱动时,如果使用的是PDO redis等阻塞式扩展,则自动退化为只有一个连接的连接池
  • 在没有数据库组件开启池的话,要加锁的
  • 深林孤鹰 7天前

    嗯,这个我看了,而且官方文档里说:

    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定时器这些有限的协程功能?请赐教~

  • 故人重来 7天前

    Fiber 你去看文档,阻塞下还是同步的操作的。你去看下文档;我求求你啊。

  • 深林孤鹰 6天前

    好的,谢谢

×
🔝