Поставить выполнять код в очередь (Queues)

В Laravel можно ставить выполнение кода «в очередь». После того как выполнится текущий код, начнёт выполняться следующий. Это может быть, например, отправка email, выполнение тяжёлого кода и другие подобные ситуации.

Настройки

Задачи, которые надо выполнить поочерёдно, хранятся в базе данных. Для этого надо создать таблицу.

php artisan queue:table
php artisan migrate

В результате будет создана таблица jobs, в которой будет храниться список задач, которые надо выполнить.

И в настройках указать, что хранить очерёдность задач надо в базе данных.

# .env
QUEUE_CONNECTION=database

# config/queue.php
'default' => env('QUEUE_CONNECTION', 'sync'),

Поставить код в очередь

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

php artisan make:job SendEmail

В результате будет создан файл app/Jobs/SendEmail.php.

# app/Jobs/SendEmail.php

class SendEmail implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    public function handle()
    {
        // Выполнить код
    }
}

Теперь данный код можно добавить в очередь на выполнение через функцию dispatch().

use App/Jobs/SendEmail;
// …

// Добавить выполнение кода в очередь
dispatch(new SendEmail());

Чтобы выполнять код поочерёдно, надо вызвать команду в консоли.

php artisan queue:work

Данная команда будет постоянно активна, и будет поочерёдно выполнять код, как только он появится.

Также можно выполнить один код, который находится следующий для выполнения.

php artisan queue:work --once

Передавать параметры

Передавать параметры можно через код ниже:

$data = [
    'lang' => 'PHP'
];

dispatch(new SendEmail($data));

Теперь в коде доступны указанные переменные.

# app/Jobs/SendEmail.php

class SendEmail implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $lang;

    public function __construct($data)
    {
        $this->lang = $data['lang'];
    }

    public function handle()
    {
        // теперь можно использовать переменную
        $this->lang;
    }
}

Задать время, через которое выполнять код

Задать время, через которое надо выполнять код, можно через метод delay().

use Carbon\Carbon;

// Выполнить код через 10 минут
$job = (new SendEmail())->delay(Carbon::now()->addMinutes(10));
dispatch($job);