Skip to content

hyperf 中 Database 连接池的设计,是在 defer 中释放连接到连接池,那么就会出现一种情况。

PHP
// 读取用户信息
$user = User::query()->find(1);

// 请求第三方接口
$client->request($user);

// 保存用户信息
$user->save();

以上场景,就会导致 DB 连接一直在当前协程的上下文中,虽然中间请求第三方接口,耗时了很久,但其他协程都无法拿到当前的 DB 连接。这就导致,连接池内的连接数会被迅速消耗, 一旦时间过长,其他请求可能就会出现连接耗尽的异常。

显而易见,我们只需要让读取用户信息的逻辑,跑在子协程中,然后配合 Channel 阻塞当前协程即可。

v2.1 里已经实现了这个方法,v2.0 中我们可以导入以下组件

php
composer require gemini/waiter

然后我们可以调用 wait() 方法,达成这个效果。

php
// 读取用户信息
$user = wait(function() {
    return User::query()->find(1);
});

// 请求第三方接口
$client->request($user);

// 保存用户信息
$user->save();

写在最后

———————————————— 原文作者:李铭昕 转自链接:https://learnku.com/articles/52533 版权声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请保留以上作者信息和原文链接。

豫ICP备14024610号-1