2015-03-03 3 views
1

Я написал своего потребителя в очередь 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. Установка ttr до 30 секунд при конфигурации Beanstalkd, бездействия.

Я не знаю, что еще мне нужно делать?

Бревна, как это:

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

Это будет скорее случай сценария, который не использует HTTP-клиент, который может установить соответствующий тайм-аут в базовой библиотеке (которая, вероятно, была бы libCurl), а не системы верхнего уровня.

Код PHP вызывает некоторый веб-клиент, который может вызывать библиотеку на основе C, которая открывает сетевое соединение, которое не работает.

Если соединение с Beanstalkd по-прежнему открыто, возможно, это не так, как TTR, поскольку это отдельный экземпляр и код PHP, но если скрипт застрял, это не поможет вам.

Возможно, вам нужен лучший HTTP-клиент, который может генерировать тайм-аут для себя, чтобы поймать это и удалить или похоронить работу.

Тем временем, если есть один URL-адрес, который терпит неудачу - просто ничего не делайте с этим, удалите его, если увидите его.