我为Beanstalkd队列编写了我的使用者,用Supervisord运行它。
php5.5-sp %appdir%/worker
worker
是一个PHP文件,循环时间为1秒。类似的东西:
#!/usr/bin/env php
<?php
while(true)
{
echo time() . PHP_EOL;
exec("php5.5-sp -d max_execution_time=30 job");
sleep(1);
}
job
(文件)使用Beanstalkd,弹出作业,尝试处理它。
// job
require __DIR__.'/vendor/autoload.php';
# Initialize beanstalkd
$beanstalkd = new Illuminate\Queue\Worker($queue->getQueueManager(), null, null);
try {
$beanstalkd ->pop('default', 'default', 2, 8192);
} catch (Exception $e) {
Log::critical($e->getMessage());
}
queue
是这样的:
<?php namespace Aristona\Queue;
class ArticleParserService
{
public function fire($job, Array $data)
{
// Do some time taking stuff
}
}
一切正常。问题是,有时我希望超时(例如我尝试获取的站点有一个重定向循环),但队列只是永远运行。由于它没有停止,其余的队列都被阻止了。
我试过了:
添加-d max_execution_time=30
,无效。
在队列中设置max_execution_time
,无效。
在Beanstalkd配置上将ttr
设置为30秒,无效。
我不知道我还应该做什么?
日志是这样的:
sudo supervisord > tail -f queue
Worker is looping on [production] at 1425389013...
Worker is looping on [production] at 1425389016...
Worker is looping on [production] at 1425389017...
Worker is looping on [production] at 1425389019...
Worker is looping on [production] at 1425389023...
Worker is looping on [production] at 1425389027... (stuck here forever)
vi debug.log
DEBUG - 2015-03-03 08:23:59 :: There is no image in the feed. Attempting to guess it.
DEBUG - 2015-03-03 08:23:59 :: Guessing image from URL: https://www.aksent-tercume.com/di%c4%9fer-diller/212-dilde-seni-seviyorum-de/
DEBUG - 2015-03-03 08:24:01 :: Guessed an appropriate image!
DEBUG - 2015-03-03 08:24:01 :: Validating image size...
具有“验证图像大小...”的部分,其中一切都永远停止,并且它始终在同一个URL中。 (https://www.aksent-tercume.com/di%c4%9fer-diller/212-dilde-seni-seviyorum-de/)
所有脚本都连接到一个URL,为文章找到最合适的图像,然后检查它的大小以确保它大于60x60像素。但由于某种原因,它只是停在那里,永远阻止我们的队列。我无法让它超时。只有以下内容才能使队列恢复正常。
sudo service beanstalkd restart
sudo supervisorctl > restart all
有什么想法吗?
答案 0 :(得分:0)
这似乎更像是脚本没有使用可以在底层库(可能是libCurl)中设置适当超时的HTTP客户端,而不是顶层系统。
PHP代码调用一些Web客户端,它可能正在调用一个基于C的库,它打开一个失败的网络连接。
如果与Beanstalkd的连接仍处于打开状态,则可能是TTR失败,因为它与PHP实例和代码分开,但如果脚本卡住,则无法帮助您。
您可能需要一个更好的HTTP客户端,它可以为自己生成超时,捕获,删除或埋葬作业。
与此同时,如果某个网址失败了 - 只是不对此做任何事情,请在发现后将其删除。