Может войдёшь?
Черновики Написать статью Профиль

Очереди

перевод документация 5.х

  1. 1. Введение
    1. 1.1. Настройка
    2. 1.2. Требования для драйверов
  2. 2. Написание классов задач
    1. 2.1. Генерирование классов задач
    2. 2.2. Структура класса задачи
  3. 3. Добавление задачи в очередь
    1. 3.1. Отложенные задачи
    2. 3.2. Получение задач из запросов
    3. 3.3. Добавление замыканий в очередь
    4. 3.4. События задач
  4. 4. Запуск слушателя очереди
    1. 4.1. Настройка Supervisor
    2. 4.2. Демон-обработчик очереди
    3. 4.3. Развёртывание с помощью демонов-обработчиков очереди
  5. 5. Push-очереди
  6. 6. Проваленные задачи
    1. 6.1. События проваленных задач
    2. 6.2. Повторный запуск проваленных задач
Этот перевод актуален для англоязычной документации на (ветка 5.2) , (ветка 5.1) и (ветка 5.0). Опечатка? Выдели и нажми Ctrl+Enter.

Введение

Компонент Laravel Queue предоставляет единое API для различных сервисов очередей. Очереди позволяют вам отложить выполнение времязатратной задачи, такой как отправка e-mail, на более позднее время, таким образом на порядок ускоряя обработку запросов в вашем приложении.

Настройка

Настройки очередей хранятся в файле config/queue.php. В нём вы найдёте настройки для каждого драйвера очереди, которые поставляются вместе с фреймворком: база данных, Beanstalkd, IronMQ (только для версии 5.1 и ранее), Amazon SQS, Redis, null, а также синхронный драйвер (для локального использования). Драйвер null просто отменяет задачи очереди, поэтому они никогда не выполнятся.

Требования для драйверов

База данных

Для использования драйвера очереди database вам понадобится таблица в БД для хранения задач. Чтобы генерировать миграцию для создания этой таблицы, выполните Artisan-команду shqueue:table. Когда миграция создана, вы можете мигрировать свою базу данных командой shmigrate:

shphp artisan queue:table

php artisan migrate

Зависимости других очередей

Упомянутые выше драйвера имеют следующие зависимости:

  • Amazon SQS: aws/aws-sdk-php ~3.0
  • Beanstalkd: pda/pheanstalk ~3.0
  • IronMQ: iron-io/iron_mq ~2.0|~4.0 (только для версии 5.1 и ранее)
  • Redis: predis/predis ~1.0

Написание классов задач

Генерирование классов задач

По умолчанию все помещаемые в очередь задачи вашего приложения хранятся в папке app/Jobs (в версии 5.0 App\Commands). Вы можете сгенерировать новую задачу для очереди с помощью Artisan-команды:

+ 5.2

добавлено в 5.2 ()

shphp artisan make:job SendReminderEmail
+ 5.1

добавлено в 5.1 ()

shphp artisan make:job SendReminderEmail --queued
+ 5.0

добавлено в 5.0 ()

shphp artisan make:command SendEmail --queued

Эта команда создаст новый класс в папке app/Jobs. Класс будет реализацией интерфейса Illuminate\Contracts\Queue\ShouldQueue, так Laravel поймёт, что задачу надо поместить в очередь, а не выполнить немедленно.

Структура класса задачи

Классы задач очень просты, обычно они содержат только метод PHPhandle(), который вызывается при обработке задачи в очереди. Для начала давайте посмотрим на пример класса задачи:

PHP
<?php

namespace App\Jobs;

use 
App\User;
use 
App\Jobs\Job;
use 
Illuminate\Contracts\Mail\Mailer;
use 
Illuminate\Queue\SerializesModels;
use 
Illuminate\Queue\InteractsWithQueue;
use 
Illuminate\Contracts\Queue\ShouldQueue;

//для версии 5.1 и ранее:
//use Illuminate\Contracts\Bus\SelfHandling;
//
//class SendReminderEmail extends Job implements SelfHandling, ShouldQueue

class SendReminderEmail extends Job implements ShouldQueue
{
  use 
InteractsWithQueueSerializesModels;

  protected 
$user;

  
/**
   * Создание нового экземпляра задачи.
   *
   * @param  User  $user
   * @return void
   */
  
public function __construct(User $user)
  {
    
$this->user $user;
  }

  
/**
   * Выполнение задачи.
   *
   * @param  Mailer  $mailer
   * @return void
   */
  
public function handle(Mailer $mailer)
  {
    
$mailer->send('emails.reminder', ['user' => $this->user], function ($m) {
      
//
    
});

    
$this->user->reminders()->create(...);
  }
}

Обратите внимание, в этом примере мы можем передать модель Eloquent напрямую в конструктор задачи. Благодаря используемому в задаче типажу SerializesModels, модели Eloquent будут изящно сериализованы и десериализованы при выполнении задачи. Если ваша задача принимает модель Eloquent в своём конструкторе, в очередь будет сериализован только идентификатор модели. А когда очередь начнёт обработку задачи, система очередей автоматически запросит полный экземпляр модели из БД. Это всё полностью прозрачно для вашего приложения и помогает избежать проблем, связанных с сериализацией полных экземпляров моделей Eloquent.

Метод PHPhandle() вызывается при обработке задачи очередью. Обратите внимание, что мы можем указывать зависимости в методе PHPhandle() задачи. сервис-контейнер Laravel автоматически внедрит эти зависимости.

+ 5.0

добавлено в 5.0 ()

Если вы хотите, чтобы у команды был отдельный класс-обработчик, вам надо добавить ключ sh--handler в команду shmake:command:

shphp artisan make:command SendEmail --queued --handler

Если что-то пошло не так

Если во время выполнения задачи возникло исключение, она будет автоматически возвращена в очередь, и можно будет снова попробовать выполнить её. Попытки будут повторяться до тех пор, пока не будет достигнуто заданное максимальное число для вашего приложения. Это число определяется параметром sh--tries, используемом в Artisan-задачах shqueue:listen и shqueue:work. Подробнее о запуске слушателя очереди читайте ниже.

Ручной выпуск задач

Если вы хотите «отпустить» задачу вручную, то типаж InteractsWithQueue, который уже включён в ваш сгенерированный класс задачи, предоставляет доступ к методу задачи PHPrelease(). Этот метод принимает один аргумент — число секунд, через которое задача станет снова доступной:

PHP
public function handle(Mailer $mailer)
{
  if (
condition) {
    
$this->release(10);
  }
}

Проверка числа попыток запуска

Как уже было сказано, при возникновении исключения при выполнении задачи она будет автоматически возвращена в очередь. Вы можете проверить число сделанных попыток выполнения задачи при помощи метода PHPattempts():

PHP
public function handle(Mailer $mailer)
{
  if (
$this->attempts() > 3) {
    
//
  
}
}

Добавление задачи в очередь

Стандартный контроллер Laravel расположен в app/Http/Controllers/Controller.php и использует типаж DispatchesJobs. Этот типаж предоставляет несколько методов, позволяющих вам удобно помещать задачи в очередь. Например, метод PHPdispatch():

PHP
<?php

namespace App\Http\Controllers;

use 
App\User;
use 
Illuminate\Http\Request;
use 
App\Jobs\SendReminderEmail;
use 
App\Http\Controllers\Controller;

class 
UserController extends Controller
{
  
/**
   * Послать уведомление по e-mail данному пользователю.
   *
   * @param  Request  $request
   * @param  int  $id
   * @return Response
   */
  
public function sendReminderEmail(Request $request$id)
  {
    
$user User::findOrFail($id);

    
$this->dispatch(new SendReminderEmail($user));
  }
}
+ 5.2

добавлено в 5.2 ()

Типаж DispatchesJobs

Разумеется, иногда нужно отправить задачу из другого места вашего приложения — не из маршрута или контроллера. Для этого вы можете включить типаж DispatchesJobs в любой класс своего приложения, чтобы получить доступ к его различным методам отправки. Например, вот пример класса, использующего этот типаж:

PHP
<?php

namespace App;

use 
Illuminate\Foundation\Bus\DispatchesJobs;

class 
ExampleClass
{
  use 
DispatchesJobs;
}

Функция PHPdispatch()

Или, вы можете использовать глобальную функцию PHPdispatch():

PHP
Route::get('/job', function () {
  
dispatch(new App\Jobs\PerformTask);

  return 
'Готово!';
});
+ 5.0

добавлено в 5.0 ()

Для добавления новой задачи в очередь используйте метод PHPQueue::push():

PHP
Queue::push(new SendEmail($message));

В этом примере мы используем фасад Queue напрямую. Но обычно вы будете отправлять команды в очередь через командную шину. В этой статье мы продолжим использовать фасад Queue, но также коснёмся и командной шины, поскольку она используется и для отправки синхронных задач, и для отправки задач в очередь.

Сгенерированный обработчик будет помещён в App\Handlers\Commands и будет извлечён из IoC-контейнера.

Задание очереди для задачи

+ 5.0

добавлено в 5.0 ()

Вы можете задать очередь, в которую следует посылать задачу:

PHP
Queue::pushOn('emails', new SendEmail($message));

Помещая задачи в разные очереди, вы можете разделять их по категориям, а также задавать приоритеты по количеству обработчиков разных очередей. Это не касается различных «подключений» очередей, определённых в файле настроек очереди, а только конкретных очередей в рамках одного подключения. Чтобы указать очередь используйте метод PHPonQueue() на экземпляре задачи. Метод PHPonQueue() обеспечивается типажом Illuminate\Bus\Queueable, который уже включён в базовый класс App\Jobs\Job:

PHP
<?php

namespace App\Http\Controllers;

use 
App\User;
use 
Illuminate\Http\Request;
use 
App\Jobs\SendReminderEmail;
use 
App\Http\Controllers\Controller;

class 
UserController extends Controller
{
  
/**
   * Отправить уведомление на e-mail данному пользователю.
   *
   * @param  Request  $request
   * @param  int  $id
   * @return Response
   */
  
public function sendReminderEmail(Request $request$id)
  {
    
$user User::findOrFail($id);

    
$job = (new SendReminderEmail($user))->onQueue('emails');

    
$this->dispatch($job);
  }
}
+ 5.0

добавлено в 5.0 ()

Передача одинаковых данных в несколько задач

Если вам надо передать одинаковые данные в несколько задач в очереди, вы можете использовать метод PHPQueue::bulk():

PHP
Queue::bulk([new SendEmail($message), new AnotherCommand]);
+ 5.2

добавлено в 5.2 ()

Типаж DispatchesJobs помещает задачи в очереди через подключение к очередям по-умолчанию.

Указание подключения к очереди для задачи

Если вы работаете с несколькими подключениями к очередям, то можете указать, в какое из них надо поместить задачу. Для этого служит метод PHPonConnection() на экземпляре задачи. Этот метод обеспечивается типажом Illuminate\Bus\Queueable, который уже включён в базовый класс App\Jobs\Job:

PHP
<?php

namespace App\Http\Controllers;

use 
App\User;
use 
Illuminate\Http\Request;
use 
App\Jobs\SendReminderEmail;
use 
App\Http\Controllers\Controller;

class 
UserController extends Controller
{
  
/**
   * Послать данному пользователю напоминание на e-mail.
   *
   * @param  Request  $request
   * @param  int  $id
   * @return Response
   */
  
public function sendReminderEmail(Request $request$id)
  {
    
$user User::findOrFail($id);

    
$job = (new SendReminderEmail($user))->onConnection('alternate');

    
$this->dispatch($job);
  }
}

Само собой, вы можете сцепить методы PHPonConnection() и PHPonQueue(), чтобы указать подключение и очередь для задачи:

PHP
public function sendReminderEmail(Request $request$id)
{
  
$user User::findOrFail($id);

  
$job = (new SendReminderEmail($user))
                  ->
onConnection('alternate')
                  ->
onQueue('emails');

  
$this->dispatch($job);
}

Отложенные задачи

Иногда вам может понадобиться задержать выполнение задачи в очереди. Например, вы захотите поместить в очередь задачу, которая отправляет пользователю e-mail через 5 минут после регистрации.

Вы можете добиться этого, используя метод PHPdelay() класса вашей задачи, который обеспечивается типажом Illuminate\Bus\Queueable:

PHP
<?php

namespace App\Http\Controllers;

use 
App\User;
use 
Illuminate\Http\Request;
use 
App\Jobs\SendReminderEmail;
use 
App\Http\Controllers\Controller;

class 
UserController extends Controller
{
  
/**
   * Отправить уведомление на e-mail данному пользователю.
   *
   * @param  Request  $request
   * @param  int  $id
   * @return Response
   */
  
public function sendReminderEmail(Request $request$id)
  {
    
$user User::findOrFail($id);

    
$job = (new SendReminderEmail($user))->delay(60 5);

    
$this->dispatch($job);
  }
}

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

Сервис Amazon SQS имеет ограничение на задержку в 900 секунд (15 минут).

+ 5.0

добавлено в 5.0 ()

Вы можете добиться этого, используя метод PHPQueue::later():

PHP
$date Carbon::now()->addMinutes(15);

Queue::later($date, new SendEmail($message));

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

+ 5.1 5.0

добавлено в 5.1 () 5.0 ()

Получение задач из запросов

Очень часто переменные HTTP-запросов переносятся в задачи. Поэтому вместо того, чтобы заставлять вас делать это вручную для каждого запроса, Laravel предоставляет несколько вспомогательных методов. Давайте посмотрим на метод PHPdispatchFrom() типажа DispatchesJobs. По умолчанию этот типаж включён в базовый класс контроллера Laravel:

PHP
<?php

namespace App\Http\Controllers;

use 
Illuminate\Http\Request;
use 
App\Http\Controllers\Controller;

class 
CommerceController extends Controller
{
  
/**
   * Обработка данного заказа.
   *
   * @param  Request  $request
   * @param  int  $id
   * @return Response
   */
  
public function processOrder(Request $request$id)
  {
    
// Обработка запроса...

    
$this->dispatchFrom('App\Jobs\ProcessOrder'$request);
  }
}

Этот метод проверит конструктор класса данной задачи и извлечёт переменные из HTTP-запроса (или любого другого объекта ArrayAccess) для заполнения необходимых параметров конструктора задачи. Поэтому, если класс нашей задачи принимает в конструкторе переменную productId, то шина задач попытается получить параметр productId из HTTP-запроса.

Вы также можете передать массив третьим аргументом метода PHPdispatchFrom(). Этот массив будет использован для заполнения тех параметров, которых нет в запросе:

PHP
$this->dispatchFrom('App\Jobs\ProcessOrder'$request, [
    
'taxPercentage' => 20,
]);
+ 5.0

добавлено в 5.0 ()

Добавление замыканий в очередь

Вы можете помещать в очередь и функции-замыкания. Это очень удобно для простых, быстрых задач, выполняющихся в очереди.

Добавление замыкания в очередь

PHP
Queue::push(function($job) use ($id)
{
  
Account::delete($id);

  
$job->delete();
});

Вместо того, чтобы делать объекты доступными для замыканий в очереди через директиву PHPuse, передавайте первичные ключи и повторно извлекайте связанные модели из вашей задачи в очереди. Это часто позволяет избежать неожиданного поведения при сериализации.

При использовании push-очередей Iron.io будьте особенно внимательны при добавлении замыканий. Конечная точка выполнения, получающая ваше сообщение, должна проверить входящую последовательность-ключ, чтобы удостовериться, что запрос действительно исходит от Iron.io. Например, ваша конечная push-точка может иметь адрес вида https://yourapp.com/queue/receive?token=SecretToken — где значение token можно проверять перед собственно обработкой задачи.

События задач

События выполнения задачи

Методы PHPQueue::before() и PHPQueue::after() позволяют зарегистрировать обратный вызов, который будет выполнен до выполнения задачи или после успешного выполнения задачи. Обратные вызовы — отличная возможность для выполнения дополнительного журналирования, помещения в очередь последующей задачи, или увеличения статистики для панели управления. Например, мы можем прикрепить обратный вызов к этому событию из AppServiceProvider, который включён в Laravel:

PHP
<?php

namespace App\Providers;

use 
Queue;
use 
Illuminate\Support\ServiceProvider;
//для версии 5.2 и выше:
use Illuminate\Queue\Events\JobProcessed;

class 
AppServiceProvider extends ServiceProvider
{
  
/**
   * Начальная загрузка всех сервисов приложения.
   *
   * @return void
   */
  
public function boot()
  {
    
//для версии 5.2 и выше:
    
Queue::after(function (JobProcessed $event) {
      
// $event->connectionName
      // $event->job
      // $event->data

    //для версии 5.1 и ранее:
    //Queue::after(function ($connection, $job, $data) {
    //  //
    
});
  }

  
/**
   * Регистрация сервис-провайдера.
   *
   * @return void
   */
  
public function register()
  {
    
//
  
}
}

Запуск слушателя очереди

Запуск слушателя очереди

Laravel включает в себя Artisan-команду, которая будет выполнять новые задачи по мере их поступления. Вы можете запустить слушателя командой shqueue:listen:

shphp artisan queue:listen
+ 5.2

добавлено в 5.2 ()

Вы также можете указать, какое именно соединение должно прослушиваться:

shphp artisan queue:listen connection-name
+ 5.1 5.0

добавлено в 5.1 () 5.0 ()

shphp artisan queue:listen connection

Заметьте, что когда это задание запущено, оно будет продолжать работать, пока вы не остановите его вручную. Вы можете использовать монитор процессов, такой как Supervisor, чтобы удостовериться, что задание продолжает работать.

Приоритеты очереди

Вы можете передать команде shlisten список подключений к очереди через запятую, чтобы задать приоритеты для очереди:

shphp artisan queue:listen --queue=high,low

В этом примере задачи из подключения high-connection всегда будут обрабатывать перед задачами из low-connection.

Указание времени на выполнение задачи

Кроме этого вы можете указать число секунд, в течение которых будет выполняться каждая задача:

shphp artisan queue:listen --timeout=60

Указание перерыва между задачами

Также вы можете задать число секунд ожидания перед проверкой наличия новых задач в очереди:

shphp artisan queue:listen --sleep=5

Обратите внимание, что очередь «засыпает» только тогда, когда в ней нет задач. Если задачи есть, очередь будет продолжать обрабатывать их без перерыва.

+ 5.2 5.0

добавлено в 5.2 () 5.0 ()

Обработка только первой задачи в очереди

Для обработки только первой задачи можно использовать команду shqueue:work:

shphp artisan queue:work

Настройка Supervisor

Supervisor — монитор процессов для ОС Linux, он автоматически перезапустит ваши команды shqueue:listen и shqueue:work, если они остановятся. Для установки Supervisor в Ubuntu можно использовать такую команду:

shsudo apt-get install supervisor

Файлы настроек Supervisor обычно находятся в папке /etc/supervisor/conf.d. Там вы можете создать любое количество файлов с настройками, по которым Supervisor поймёт, как отслеживать ваши процессы. Например, давайте создадим файл laravel-worker.conf, который запускает и наблюдает за процессом queue:work:

conf[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /home/forge/app.com/artisan queue:work sqs --sleep=3 --tries=3 --daemon
autostart=true
autorestart=true
user=forge
numprocs=8
redirect_stderr=true
stdout_logfile=/home/forge/app.com/worker.log

В этом примере numprocs указывает, что Supervisor должен запустить 8 процессов queue:work и наблюдать за ними, автоматически перезапуская их при их остановках. Само собой, вам надо изменить часть queue:work sqs директивы command в соответствии с вашим драйвером очереди.

После создания файла настроек вы можете обновить конфигурацию Supervisor и запустить процесс при помощи следующих команд:

shsudo supervisorctl reread

sudo supervisorctl update

sudo supervisorctl start laravel-worker:*

Подробнее о настройке и использовании Supervisor читайте в его документации. В качестве альтернативы вы можете использовать Laravel Forge для автоматической настройки и управления конфигурацией вашего Supervisor через удобный веб-интерфейс.

Демон-обработчик очереди

Команда shqueue:work также имеет опцию sh--daemon для того, чтобы обработчик принудительно продолжал обрабатывать задачи без необходимости повторной загрузки фреймворка. Это приводит к значительному снижению использования CPU по сравнению с командой shqueue:listen.

Для запуска обработчика очереди в режиме демона используйте флаг sh--daemon:

+ 5.2

добавлено в 5.2 ()

shphp artisan queue:work connection-name --daemon

php artisan queue:work connection-name --daemon --sleep=3

php artisan queue:work connection-name --daemon --sleep=3 --tries=3
+ 5.1 5.0

добавлено в 5.1 () 5.0 ()

shphp artisan queue:work connection --daemon

php artisan queue:work connection --daemon --sleep=3

php artisan queue:work connection --daemon --sleep=3 --tries=3

Как видите, команда shqueue:work поддерживает те же самые опции, что и команда shqueue:listen. Для просмотра всех доступных опций используйте команду shphp artisan help queue:work.

Написание кода для демонов-обработчиков очереди

Демоны-обработчики очереди не перезапускают фреймворк перед обработкой каждой задачи. Поэтому нужно быть аккуратным при освобождении любых «тяжёлых» ресурсов до того, как закончится выполнение вашей задачи. Например, если вы обрабатываете изображение с помощью библиотеки GD, то после завершения обработки вам необходимо освобождать память с помощью PHPimagedestroy().

+ 5.1 5.0

добавлено в 5.1 () 5.0 ()

Также ваше соединение с БД может быть потеряно, когда оно используется демоном долгое время. Вы можете использовать метод PHPDB::reconnect(), для обеспечения «свежего» соединения.

Развёртывание с помощью демонов-обработчиков очереди

Поскольку демоны-обработчики очереди — длительные процессы, они не подхватывают изменения в коде без перезапуска. Поэтому простейший способ развернуть приложение, используя обработчики очереди, — перезапустить их во время выполнения скрипта развёртывания. Вы можете изящно перезапустить все обработчики, включив следующую команду в ваш скрипт для развёртывания:

shphp artisan queue:restart
+ 5.2

добавлено в 5.2 ()

Эта команда сообщит всем обработчикам очереди о необходимости «умереть» после завершения обработки их текущих задач, поэтому текущие задачи не пропадут. Не забывайте, что обработчики очереди умрут при выполнении команды shqueue:restart, поэтому необходимо запустить менеджер процессов, такой как Supervisor, который автоматически перезапустит обработчики задач.

+ 5.1 5.0

добавлено в 5.1 () 5.0 ()

Эта команда сообщит всем обработчикам очереди о необходимости перезапуска после завершения обработки их текущих задач, поэтому текущие задачи не пропадут.

Эта команда полагается на систему кэша для планирования перезапуска. По умолчанию APCu не работает для терминальных задач. Если вы используете APCu, добавьте confapc.enable_cli=1 в свою конфигурацию для APCu.

+ 5.0

добавлено в 5.0 ()

Push-очереди

Push-очереди дают вам доступ ко всем мощным возможностям, предоставляемым подсистемой очередей Laravel 5, без запуска демонов и фоновых слушателей. На текущий момент push-очереди поддерживает только драйвер Iron.io. Перед тем, как начать, создайте аккаунт и впишите его данные в config/queue.php.

Регистрация подписчика push-очереди

После этого вы можете использовать Artisan-команду shqueue:subscribe для регистрации URL конечной точки, которая будет получать добавляемые в очередь задачи:

shphp artisan queue:subscribe queue_name queue/receive

php artisan queue:subscribe queue_name http://foo.com/queue/receive

Теперь, когда вы войдёте в ваш профиль Iron.io, то увидите новую push-очередь и URL её подписки. Вы можете подписать любое число URL на одну очередь. Дальше создайте маршрут для вашей конечной точки queue/receive, и пусть он возвращает результат вызова метода PHPQueue::marshal():

PHP
Route::post('queue/receive', function()
{
  return 
Queue::marshal();
});

Этот метод позаботится о вызове нужного класса-обработчика задачи. Для помещения задач в push-очередь просто используйте всё тот же метод PHPQueue::push(), который работает и для обычных очередей.

Проваленные задачи

Не всегда всё идёт по плану, иногда ваши задачи в очереди будут заканчиваться ошибкой. Не волнуйтесь, такое с каждым случается! В Laravel есть удобный способ указать максимальное количество попыток выполнения задачи. После превышения этого количества попыток задача будет добавлена в таблицу failed_jobs. Название таблицы проваленных задач может быть настроено в файле config/queue.php.

Для создания миграции для таблицы failed_jobs, можно использовать команду shqueue:failed-table:

shphp artisan queue:failed-table

При запуске вашего слушателя очереди можно указать максимальное количество попыток выполнения задачи с помощью ключа sh--tries команды shqueue:listen:

shphp artisan queue:listen connection-name --tries=3

События проваленных задач

Если вы хотите зарегистрировать событие, которое будет вызываться при ошибке выполнения задачи, можете использовать метод PHPQueue::failing(). Это событие — отличная возможность оповестить вашу команду через e-mail или HipChat. Например, мы можем прикрепить обратный вызов к данному событию из AppServiceProvider, который включён в Laravel:

PHP
<?php

namespace App\Providers;

use 
Queue;
use 
Illuminate\Support\ServiceProvider;
//для версии 5.2 и выше:
use Illuminate\Queue\Events\JobFailed;

class 
AppServiceProvider extends ServiceProvider
{
  
/**
   * Начальная загрузка всех сервисов приложения.
   *
   * @return void
   */
  
public function boot()
  {
    
//для версии 5.2 и выше:
    
Queue::failing(function (JobFailed $event) {
      
// $event->connectionName
      // $event->job
      // $event->data

    //для версии 5.1 и ранее:
    //Queue::failing(function ($connection, $job, $data) {
    //  // Оповещение команды о проваленной задаче...
    
});
  }

  
/**
   * Регистрация сервис-провайдера.
   *
   * @return void
   */
  
public function register()
  {
    
//
  
}
}

Метод PHPfailed() класса задачи

Для более точного контроля, вы можете определить метод PHPfailed() непосредственно в классе задачи, это позволит выполнять специфичное для задачи действие при возникновении ошибки:

PHP
<?php

namespace App\Jobs;

use 
App\Jobs\Job;
use 
Illuminate\Contracts\Mail\Mailer;
use 
Illuminate\Queue\SerializesModels;
use 
Illuminate\Queue\InteractsWithQueue;
use 
Illuminate\Contracts\Queue\ShouldQueue;

//для версии 5.1 и ранее:
//use Illuminate\Contracts\Bus\SelfHandling;
//
//class SendReminderEmail extends Job implements SelfHandling, ShouldQueue

class SendReminderEmail extends Job implements ShouldQueue
{
  use 
InteractsWithQueueSerializesModels;

  
/**
   * Выполнение задачи.
   *
   * @param  Mailer  $mailer
   * @return void
   */
  
public function handle(Mailer $mailer)
  {
    
//
  
}

  
/**
   * Обработка ошибки задачи.
   *
   * @return void
   */
  
public function failed()
  {
    
// Вызывается при ошибке в задаче...
  
}
}
+ 5.0

добавлено в 5.0 ()

Если задача не само-обрабатываемая, а имеет отдельный класс-обработчик, то метод PHPfailed() должен быть определён именно там.

Повторный запуск проваленных задач

Чтобы просмотреть все проваленные задачи, которые были помещены в вашу таблицу failed_jobs, можно использовать Artisan-команду shqueue:failed:

shphp artisan queue:failed

Эта команда выведет список задач с их ID, подключением, очередью и временем ошибки. ID задачи можно использовать для повторной попытки её выполнения. Например, для повторной попытки выполнения задачи с ID = 5 надо выполнить такую команду:

shphp artisan queue:retry 5

Чтобы повторить все проваленные задачи, используйте shqueue:retry с указанием shall вместо ID:

shphp artisan queue:retry all

Если вы хотите удалить проваленную задачу, используйте команду shqueue:forget:

shphp artisan queue:forget 5

Для удаления всех проваленных задач используйте команду shqueue:flush:

shphp artisan queue:flush

Комментарии (2)

Sawa4

Событие завершения задачи

PHP
Queue::failing(function ($connection$job$data) {
      
// Оповещение команды о проваленной задаче...
    
});

Ребята подскажите что и откуда приходит в переменных $connection, $job, $data?

WarLight

При переводе, видимо, потеряли sync:
а также синхронный драйвер (для локального использования)
Перевели — хорошо. Но название драйвера тоже наверное хорошо бы указать)

Написать комментарий

Разметка: ? ?

Авторизуйся, чтобы прокомментировать.