Laravel 5 Run queue: работа по расписанию Laravel - PullRequest
0 голосов
/ 24 декабря 2018

У меня есть расписание, подобное этому:

<?php

namespace App\Console;

use Illuminate\Support\Facades\Artisan;
use Illuminate\Console\Scheduling\Schedule;
protected function schedule(Schedule $schedule)
{
   Artisan::call('queue:work');
}

Я добавляю это в свой cronjob:

* * * * * cd /var/www/html/my_script_address && php artisan schedule:run

Это правильный код?Я спрашиваю, потому что каждую минуту бегать Artisan::call('queue:work').

Это лучший способ?

Ответы [ 4 ]

0 голосов
/ 11 июня 2019

Ваш работник очереди должен работать самостоятельно.Вы должны использовать supervisor, чтобы убедиться, что он продолжает работать.Однако, если вам нужно запустить работника очереди из планировщика, вероятно, лучше всего использовать queue:work --stop-when-empty

0 голосов
/ 24 декабря 2018

Я хотел написать длинный ответ с объяснением.

1 - Crontab - менеджер по расписанию.Он вызывает вашу команду каждый раз, когда запускается планировщик.

Например: если вы создадите запись в crontab, чтобы написать hello world раз в минуту, она будет делать это каждую минуту, и до вечности.

2 - Работник очереди слушает очередь, и она работает, если есть какая-либо работа, ожидающая выполнения.Очень похоже на задания cron, но время выполнения не предопределено.Убедитесь сами:

/**
 * Listen to the given queue in a loop.
 *
 * @param  string  $connectionName
 * @param  string  $queue
 * @param  \Illuminate\Queue\WorkerOptions  $options
 * @return void
 */
public function daemon($connectionName, $queue, WorkerOptions $options)
{
    // [...]
    while (true) {
        ...
    }
}

Как вы видите, она продолжает, пока что-то из внешнего мира не остановит ее.

4- Ваш планировщик будет создавать еще одного работника, подобного этому каждую минуту.


Используйте что-то вроде supervisor, чтобы наблюдать за своими работниками.И вдумчиво создавайте свои рабочие экземпляры.См. конфигурация супервизора часть документации по laravel.

Если вы настаиваете на совместном использовании cron и queue workers, используйте queue:work --once, чтобы сообщить вашему работнику, когда нужно остановиться:)

0 голосов
/ 31 мая 2019

согласно документации https://laravel.com/docs/5.8/scheduling#scheduling-queued-jobs

Вы можете просто поставить работу в очередь через:

$schedule->job(new Heartbeat)->everyFiveMinutes();
0 голосов
/ 24 декабря 2018

Если вы просто хотите запустить задание по расписанию, просто напишите в `app / console / kernel.php``:

protected function schedule(Schedule $schedule)
{
    $schedule->call(function () {
        // Do something
        DB::table('recent_users')->delete();
    })->daily();
}

и укажите код ниже /etc/cron.d/laravel-project:

* * * * * cd /path/to/laravel-project-root && php artisan schedule:run >> /dev/null 2>&1

См .: https://laravel.com/docs/5.7/scheduling#introduction


Queue предназначен для запуска асинхронной задачи, вы можете установить supervisor , чтобы queue:work всегда работал.

См. этот документ , настройте queue:work и supervisor и используйте задачу расписания, чтобы отправить задание в очередь.Измените app/console/kernel.php:

protected function schedule(Schedule $schedule)
{
    $schedule->call(function () {
        // Do something
        App\MyScheduleJob::dispatch();
    })->daily();
}

Теперь очередь всегда должна работать, и задание по расписанию может отправляться в очередь каждый день.

...