Mehod doBackground of GearmanClient及其后代如doLowBackground和doHighBackground有时会挂起,我想不出原因。
php 5.4版
Gearman服务器版本1.1.18
Gearman php库版本1.1.2
在某个时间点上,用户点击按钮,任务(超过700个)就会转到gearman。DoBackground会随机冻结,它可以在20个任务进入gearman后挂起,也可以在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
的
libgearman for php是用yum自动安装的
。似乎也有同样的问题,但是!!!它出现得非常非常少。
当然,这是一个非常关键的问题,如果你发出A计数和B计数进入队列。
附言:不同环境的原因是我们仍然不能移植到php7。Php5.4是prod,php7是dev
2条答案
按热度按时间knpiaxh11#
这不是gearmand,也不是php扩展的问题
https://github.com/gearman/gearmand/issues/241
hmmo2u0o2#
客户端初始化应该在循环外进行。我遇到了同样的问题。当你在循环内初始化时,内存会耗尽。希望这对你有帮助!
https://stackoverflow.com/a/54442341/4932684