Как правильно установить время ожидания для очередей?

Я написал своего потребителя для очереди 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-адресу, находит наиболее подходящее изображение для статьи, а затем проверяет его размер, чтобы убедиться, что он больше 60×60 пикселей. Но по какой-то причине он просто останавливается там, навсегда блокируя наши очереди. Я не могу получить это по таймауту. Только следующее возвращает очереди в нормальное состояние.

sudo service beanstalkd restart
sudo supervisorctl > restart all

Есть идеи?

1

Решение

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

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

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

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

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector