PHP GearmanClient :: doBackground刚刚挂起

时间:2019-05-15 14:53:58

标签: yii gearman

方法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

2 个答案:

答案 0 :(得分:1)

客户端初始化应该在循环之外进行。我遇到了同样的问题。 在循环内启动时,内存将耗尽。希望这对您有帮助!

https://stackoverflow.com/a/54442341/4932684

答案 1 :(得分:0)

这不是Gearmand,也不是php扩展问题

https://github.com/gearman/gearmand/issues/241