Запуск очереди 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
Примечание: на моем общем хосте я должен установить следующие значения из-за конфигурации их сервера:
- php: /opt/plesk/php/7.2/bin/php -q
- ремесленник: /var/www/vhosts/t4f.ir/httpdocs/artisan
- моя команда: тогда я должен написать команду
итак, результат будет таким:
/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:
- Чтобы очистить кеш:
/usr/local/bin/php /home/<path-to-project>/artisan cache:clear
- Чтобы запустить планировщик
/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