Hyperf 协程踩坑记
单例保存请求态、协程上下文丢失、连接池打满。
一、别在单例上存请求态
容器里的对象是长驻的,跨请求共享。把当前用户塞进 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





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