Запуск очереди laravel: работа на виртуальном хостинге

Я хочу, чтобы моя очередь laravel: работа продолжалась на общем хостинге, это общий хостинг (я не на VPS), я ничего не могу установить, потому что почти все онлайн-источники, когда я искал это, предлагают установить супервизор. В общем, я подумал, что мог бы просто создать задание cron, которое проверяет, не запущена ли очередь, и запускает ли оно, любую помощь, как это сделать, потому что я немного застрял, спасибо.

PS Нахожусь на сервере Linux и Laravel 5.3

9 ответов

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

Шаг 1. вам нужно настроить драйвер очереди как database

Шаг 2, вам нужно настроить работу cron с помощью следующей команды php /path/to/application/artisan queue:work --queue=high,default,

Вы можете попробовать. Я надеюсь, что это сработает.

Ларавель> = 5,7

Добавление этой строки в планировщик в app\Console\Kernel.php, а затем настройка задания cron для запуска планировщика гарантирует, что очередь будет обслуживаться каждую минуту.

      $schedule->command('queue:work --stop-when-empty')
    ->everyMinute()
    ->withoutOverlapping();

Для серверов Cpanel оператор Cron может выглядеть так:

      * * * * * /usr/local/bin/php /home/{account_name}/live/artisan schedule:run

где {account_name} — это учетная запись пользователя, под которой работает cpanel, а live — это папка приложения laravel.

Источник: https://talltips.novate.co.uk/laravel/using-queues-on-shared-hosting-with-laravel

Ларавель <= 5,6

--onceЧтобы заставить работника выйти после выполнения одного задания

--triesМаксимальное количество попыток задания

--timeoutМожно указать максимальное количество секунд, в течение которых могут выполняться задания.

withoutOverlapping()По умолчанию запланированные задачи будут выполняться, даже если предыдущий экземпляр задачи все еще выполняется. Чтобы предотвратить это, вы можете использовать метод без перекрытия.

sendOutputTo()Отправить вывод в файл для последующей проверки

      $schedule->command('queue:work --timeout=60 --tries=1 --once')
    ->everyMinute()
    ->withoutOverlapping()
    ->sendOutputTo(storage_path() . '/logs/queue-jobs.log');

Laravel Все версии

Если вы не хотите использовать параметры `--once' или '--max-time', лучше использовать команду перезагрузки, чтобы избежать утечки памяти и применить изменения кода.

      $schedule->command('queue:restart')
    ->everyFiveMinutes();

Ларавель <= 5.2

Не рекомендуется:

Параметры --daemon продолжали работать, которые вы можете запустить один раз из командной строки, если у вас есть доступ к «команде» ssh или cpanel.

В Laravel 8 у вас есть возможность остановить обработку заданий через некоторое время.

      php artisan queue:work --max-time=300

Вы можете настроить задание cron, например, на 5 минут для запуска обработки задания и установить --max-timeвариант до 5 минут (300 секунд). В этом случае cron запустит прецессию задания через 300 секунд. queue:work завершится, и через пару секунд cron снова запустит обработку задания, и так далее.

Лучший способ - установить команду followin для ваших задач панели (я использую панель управления plesk, это позволяет мне ставить задачу там)

php artisan queue:work --once

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

  1. php: /opt/plesk/php/7.2/bin/php -q
  2. ремесленник: /var/www/vhosts/t4f.ir/httpdocs/artisan
  3. моя команда: тогда я должен написать команду

итак, результат будет таким:

/opt/plesk/php/7.2/bin/php -q /var/www/vhosts/t4f.ir/httpdocs/artisan queue:work --once

есть еще один вариант для среды выполнения, который я установил для типа Cron со значением: * * * * *, что означает, что этот код будет выполняться каждую минуту. поскольку я использовал --once в конце моей команды, как только он выполнит команду и задание будет завершено, оно будет прекращено. Что касается параллельного выполнения, меня не беспокоит его обработка в системе очередей и ответственность этой системы.

Это решение, которое сработало для меня после нескольких дней поиска.

flock -n /tmp/latavel_queues.lockfile /usr/bin/php /path/to/laravel/artisan queue:listen

Смотрите https://laracasts.com/discuss/channels/servers/database-queue-on-shared-hosting

Еще одно решение (таким же образом я решил ту же проблему). Вы можете сделать скрипт так:

# getting running processes with name "queue:work"
QUEUE_STATUS=$(ps aux | grep "queue:work")

# check is queue:work started, if no, start it
if $( echo $QUEUE_STATUS | grep --quiet 'artisan queue:work')
then
    exit;
else
    php ~/public_html/artisan queue:work
fi

и запустить его в CRON. Я бегаю каждые 10 минут.

Попробуйте добавить два задания cron:

  1. Чтобы очистить кеш:
/usr/local/bin/php /home/<path-to-project>/artisan cache:clear
  1. Чтобы запустить планировщик
/usr/local/bin/php /home/<path-to-project>/artisan schedule:run

Также убедитесь, что в вашем app\Console\Kernel.php есть что-то вроде

protected function schedule(Schedule $schedule)
    {
        $schedule->command('queue:work --tries=3')
            ->cron('* * * * *')
            ->withoutOverlapping(5);
    }

Удалите первое задание (то, которое удаляет кеш), если очередь начинает работать

// шаг 1: запустить планировщик

      /usr/local/bin/php /home/USERNAME/public_html/PROJECT_FOLDER/artisan schedule:run >> /dev/null 2>&1

// шаг 2 в kernel.php

      protected function schedule(Schedule $schedule)
    {
        $schedule->command('queue:work', [
        '--max-time' => 300
        ])->withoutOverlapping();

// шаг 3 тестируем. ;)

Я решил взломать, чтобы сделать это

В файле Illuminate\Queue\Worker.php моя текущая версия Laravel (5.3) находится на линии 151; на функции runNextJob($connectionName, $queue, WorkerOptions $options) добавлять else как показано ниже

if ($job) {
    return $this->process(
        $connectionName, $job, $options
    );
 } else {
    $this->stop();
}

Теперь создайте задание cron, которое будет запускаться столько раз, сколько вам нужно с помощью команды php artisan queue:work как только очередь исчерпана, она выйдет (но должна быть частой, поскольку процесс существует)

ОБНОВЛЕНИЕ: Используя расписание задач с withoutOverlapping() предотвращает дальнейшие вызовы команды, если она уже запущена, так что это лучший вариант, учитывая, что предыдущий - это изменение, которое вы должны делать каждый раз, когда вы composer install или же composer update

Другие вопросы по тегам