如何正确设置队列的超时?

时间:2015-03-03 13:33:00

标签: php multithreading queue beanstalkd

我为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
     }
}

一切正常。问题是,有时我希望超时(例如我尝试获取的站点有一个重定向循环),但队列只是永远运行。由于它没有停止,其余的队列都被阻止了。

我试过了:

  1. 添加-d max_execution_time=30,无效。

  2. 在队列中设置max_execution_time,无效。

  3. 在Beanstalkd配置上将ttr设置为30秒,无效。

  4. 我不知道我还应该做什么?

    日志是这样的:

    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
    

    有什么想法吗?

1 个答案:

答案 0 :(得分:0)

这似乎更像是脚本没有使用可以在底层库(可能是libCurl)中设置适当超时的HTTP客户端,而不是顶层系统。

PHP代码调用一些Web客户端,它可能正在调用一个基于C的库,它打开一个失败的网络连接。

如果与Beanstalkd的连接仍处于打开状态,则可能是TTR失败,因为它与PHP实例和代码分开,但如果脚本卡住,则无法帮助您。

您可能需要一个更好的HTTP客户端,它可以为自己生成超时,捕获,删除或埋葬作业。

与此同时,如果某个网址失败了 - 只是不对此做任何事情,请在发现后将其删除。