方法doBackground of GearmanClient及其后代(例如doLowBackground和doHighBackground)有时会挂起。我不知道为什么。
php 5.4
Gearman服务器版本1.1.18
Gearman php lib版本1.1.2
在某个时间点,用户单击按钮,任务(超过700个)移交给齿轮工。 DoBackground会随机冻结,它可以在放入Gearman中执行20个任务后挂起,或者可以在200-300(可能是500)个任务后挂起。
我看不到gearman / php日志中的错误,也看不到直接链接(当我直接开始调试时)
当我尝试调试时,我只是将任务数减少到50,然后直接从浏览器发出请求。如果一切顺利,浏览器的循环(加载操作)就会消失,我会看到var_dumps。但是,如果doBackground在某些任务上没有返回控制权,则浏览器请求将进入无限循环,等待服务器响应
我的代码很简单。我收集数据,放入数组中,然后一个个地发送到队列
for($i = 0; $i < count($itemsToProcess); $i++) {var_dump($i);
$method = array_shift($itemsToProcess[$i]['methodsAfter']);
Yii::app()->gearman->client()->doBackground($method, json_encode($itemsToProcess[$i]));
}
作为其他信息,我有另一台服务器
php 7.1
已安装,
服务器版本为1.1.12
和
用于PHP的libgearman与yum一起自动安装
。好像有同样的问题,但是!!!它很少出现。
如果您发出A计数而B计数进入队列,那么这当然是至关重要且非常关键的问题。
P.S:不同环境的原因是我们仍然无法迁移到php7。 php5.4是prod,而php7是dev
答案 0 :(得分:1)
客户端初始化应该在循环之外进行。我遇到了同样的问题。 在循环内启动时,内存将耗尽。希望这对您有帮助!
答案 1 :(得分:0)
这不是Gearmand,也不是php扩展问题