Hyperf 协程踩坑记

Admin
216阅读
0评论
0点赞

单例保存请求态、协程上下文丢失、连接池打满。

一、别在单例上存请求态

容器里的对象是长驻的,跨请求共享。把当前用户塞进 Service 的实例字段,高并发下必然串户。

// 错误:单例字段,跨协程共享
private ?User $currentUser = null;

// 正确:协程上下文,天然按请求隔离
Context::set('current_user', $user);

二、协程上下文不会自动继承

新开协程拿不到父协程的 Context。需要显式 Context::copy() 把需要的键带过去。

三、连接池打满

协程能轻易开出上万并发,但数据库连接池只有几十个。没做限流的话,表现是大量请求卡在等连接。

// 用 Parallel 显式限制并发数
$parallel = new Parallel(8);

四、阻塞函数拖垮整个 worker

未被 hook 的扩展(GD、Imagick)、curl_* 同步调用会阻塞整个协程调度器。这类操作要卸载到 Task Worker。

排查思路:响应突然整体变慢而 CPU 不高,八成是某处阻塞了事件循环。

上一篇暂无更多文章
下一篇基于Webman的多平台广告管理系统
评论0

暂无评论,期待您的发言...

发表评论