Поставить выполнять код в очередь (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);
Поддержать автора