Как сохранить систему очереди Laravel на сервере

Недавно я установил систему очереди Laravel. Основы - cronjob вызывает команду, которая добавляет задания в очередь и вызывает вторую команду, которая отправляет электронное письмо.

Система работает, когда я передаю ssh на свой сервер и запускаю очередь php artisan: слушайте, но если я закрою свой терминал, слушатель выключится, а задания будут стекаться и сидеть в очереди, пока я не вернусь к ssh и не запустил бы прослушивание снова.

Каков наилучший способ сохранить систему очереди в фоновом режиме без необходимости открывать мое соединение через ssh?

Я попытался запустить php artisan queue:work --daemon, и он завершил задания в очереди, но когда я закрыл терминал, он закрыл соединение и фоновый процесс.

Ответ 1

Команда

nohup php artisan queue:work --daemon &

был правильным, это позволило бы продолжить процесс после закрытия SSH-соединения; однако это лишь кратковременное решение. Как только ваш сервер будет перезагружен или любая проблема приведет к остановке процесса, вам нужно будет вернуться и снова запустить команду. Когда это произойдет, вы никогда не узнаете. Это может произойти в пятницу вечером, поэтому лучше реализовать долгосрочное решение.

Я перешел на Supervisord, это можно установить на Ubuntu так же просто, как

sudo apt-get install supervisor 

Для пользователей AWS-AMI или RedHat вы можете выполнить набор инструкций, описанных в этом вопросе:

Настройка Supervisord на сервере AWS AMI Linux

Ответ 2

Выполнение

nohup php artisan queue:work --daemon &

Препятствует выходу команды при выходе из системы.

Конечный амперсанд (&) заставляет процесс запускать в фоновом режиме, поэтому вы можете продолжать использовать оболочку и не дожидаться завершения script.

См. nohup

nohup - запустить команду, не зависящую от зависаний, с выходом на не-tty

Это выводит информацию в файл под названием nohup.out в каталоге, в котором вы запускаете команду. Если у вас нет интереса к выходу, вы можете перенаправить stdout и stderr на /dev/null, или аналогичным образом вы можете вывести его в свой обычный журнал laravel. Например

nohup php artisan queue:work --daemon > /dev/null 2>&1 &

nohup php artisan queue:work --daemon > app/storage/logs/laravel.log &

Но вы также должны использовать что-то вроде Supervisord, чтобы убедиться, что служба остается запущенной и перезапускается после сбоев/сбоев.

Ответ 3

Вы должны использовать диспетчер Linux

Установка проста, и на Ubuntu я могу установить ее с помощью следующей команды:

apt-get install supervisor

Файлы конфигурации Supervisor находятся в каталоге /etc/supervisor/conf.d.

[program:email-queue]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/laravel-example/artisan queue:work redis --queue=emailqueue --sleep=3 --tries=3
autostart=true
autorestart=true
user=forge
numprocs=2
redirect_stderr=true
stdout_logfile=/var/www/laravel-example//storage/logs/supervisord.log

Для каждого процесса вы должны создать новый файл конфигурации процесса. С помощью этой конфигурации слушатель будет трижды повторять каждое задание. Кроме того, Supervisor перезапустит прослушиватель, если он не сработает или перезапустится система.

Ответ 4

С https://gist.github.com/ivanvermeyen/b72061c5d70c61e86875

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class EnsureQueueListenerIsRunning extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'queue:checkup';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Ensure that the queue listener is running.';

    /**
     * Create a new command instance.
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return void
     */
    public function handle()
    {
        if ( ! $this->isQueueListenerRunning()) {
            $this->comment('Queue listener is being started.');
            $pid = $this->startQueueListener();
            $this->saveQueueListenerPID($pid);
        }

        $this->comment('Queue listener is running.');
    }

    /**
     * Check if the queue listener is running.
     *
     * @return bool
     */
    private function isQueueListenerRunning()
    {
        if ( ! $pid = $this->getLastQueueListenerPID()) {
            return false;
        }

        $process = exec("ps -p $pid -opid=,cmd=");
        //$processIsQueueListener = str_contains($process, 'queue:listen'); // 5.1
        $processIsQueueListener = ! empty($process); // 5.6 - see comments

        return $processIsQueueListener;
    }

    /**
     * Get any existing queue listener PID.
     *
     * @return bool|string
     */
    private function getLastQueueListenerPID()
    {
        if ( ! file_exists(__DIR__ . '/queue.pid')) {
            return false;
        }

        return file_get_contents(__DIR__ . '/queue.pid');
    }

    /**
     * Save the queue listener PID to a file.
     *
     * @param $pid
     *
     * @return void
     */
    private function saveQueueListenerPID($pid)
    {
        file_put_contents(__DIR__ . '/queue.pid', $pid);
    }

    /**
     * Start the queue listener.
     *
     * @return int
     */
    private function startQueueListener()
    {
        //$command = 'php-cli ' . base_path() . '/artisan queue:listen --timeout=60 --sleep=5 --tries=3 > /dev/null & echo $!'; // 5.1
        $command = 'php-cli ' . base_path() . '/artisan queue:work --timeout=60 --sleep=5 --tries=3 > /dev/null & echo $!'; // 5.6 - see comments
        $pid = exec($command);

        return $pid;
    }
}

Ответ 5

Лучший способ - это PM2 (Advanced, менеджер производственных процессов для Node.js), который позволяет отслеживать свои очереди и просматривать их журналы.

с командой ниже в вашем каталоге проекта, запустите работника очереди:

pm2 start artisan --name laravel-worker --interpreter php -- queue:work --daemon

Ответ 6

1) sudo apt install supervisor или

sudo apt-get install supervisor

2) cd /etc/supervisor/conf.d 3) создать новый файл внутри

sudo vim queue-worker.conf

Содержимое файла

[program:email-queue]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/html/laravelproject/artisan queue:work
autostart=true
autorestart=true
user=root
numprocs=2
redirect_stderr=true
stdout_logfile=/var/www/html/laravelproject/storage/logs/supervisord.log

4) sudo supervisorctl reread

при запуске этой команды получить выходной очереди-работника: доступно

5) sudo supervisorctl update

при запуске этой команды получить выходную очередь-работника: добавлена группа процессов

другая команда

1) sudo supervisorctl reload

при запуске этой команды получить вывод Перезапущенный супервизор

2) sudo service supervisor restart

Ответ 7

Для тех, кто уже работает NodeJS в своих производственных средах. Я использую PM2 для управления процессами приложений.

# install
npm install -g pm2

# in project dir with your CI or dev setup tool 
# --name gives task a name so that you can later manage it
# -- delimits arguments that get passed to the script
pm2 start artisan --interpreter php --name queue-worker -- queue:work --daemon

Я использую Vagrant в разработке и настройке NodeJS и этот процесс, используя только встроенные бродячие скрипты.

Когда вы используете PM2 в разработке, вы можете использовать один из многих наблюдателей для управления перезагрузкой. Просто запустите pm2 restart queue-worker, когда вы получите изменение. В производстве я не рекомендую этот подход, а предпочитаю инструмент построения, который может следовать этому процессу.

# 1. stop pm task to ensure that no unexpected behaviour occurs during build
pm2 stop queue-worker
# 2. do your build tasks
...
# 3. restart queue so that it loads the new code
pm2 restart queue-worker

Ответ 8

Что делать, если вы начинаете прослушивание на экране? См. Здесь: http://aperiodic.net/screen/quick_reference Тогда даже если вы выйдете из системы, экран все равно будет активен и работает. Не знаете, почему демонализация не работает.

Ответ 9

Использование pm2

У меня был сценарий JS, работающий с pm2 (Advanced, диспетчер производственных процессов для Node.js). Это был единственный, который я запускал. Но теперь, когда я получил еще один процесс, чтобы продолжать работать.

Я создал process.yml для запуска как с одной командой. Проверьте, чтобы первый php artisan queue: listen

# process.yml at /var/www/ which is root dir of the project
apps:
  # Run php artisan queue:listen to execute queue job
  - script    : 'artisan'
    name      : 'artisan-queue-listen'
    cwd       : '/var/www/'
    args      : 'queue:listen' # or queue:work
    interpreter : 'php'

  # same way add any other script if any.

Теперь запустите:

> sudo pm2 start process.yml

Проверьте дополнительные параметры и функцию pm2

Ответ 10

Поскольку это был конкретный вопрос, связанный с Laravel, я думал, что предлагаю конкретный ответ Lravel. Поскольку вы уже используете cronjob на этом сервере, я бы рекомендовал вам настроить команду оболочки как повторяющийся cronjob, чтобы всегда проверять, что рабочий работает. Вы можете либо настроить команду оболочки для запуска изначально через cron на своем сервере, либо вы можете использовать ядро консоли Laravel для управления командой и добавления логики, например, проверить, есть ли у вас уже рабочий рабочий и, если нет, идти вперед и запустите его.

В зависимости от того, как часто вам нужно выполнять свою команду, вы можете делать это нечасто, как раз в неделю, или даже раз в минуту. Это даст вам возможность убедиться, что ваши работники постоянно работают, не добавляя никаких накладных расходов на ваш сервер, таких как Supervisor. Предоставление разрешений для стороннего пакета, такого как супервизор, в порядке, если вы ему доверяете, но если вы можете избежать необходимости полагаться на него, вы можете захотеть рассмотреть этот подход.

Пример использования этого, чтобы делать то, что вы хотите, будет иметь cronjob, который запускается каждый час. Он будет выполнять следующее в последовательном порядке из пользовательской команды консоли Laravel:

\Artisan :: вызов ( 'очереди: перезагрузка');

\Artisan :: call ('queue: work --daemon');

Обратите внимание, что это относится к более старым версиям Laravel (до 5.3), но я не тестировал их в более новых версиях.

Ответ 11

Вы можете использовать инструмент monit. он очень мал и полезен для любого типа управления процессами и мониторинга.

После загрузки бинарного пакета из эта ссылка вы можете извлечь его в папку в вашей системе, а затем скопировать два файла из пакета в вашей системы для его установки:

cd /path/to/monit/folder
cp ./bin/monit /usr/sbin/monit
cp ./conf/monitrc /etc/monitrc  

Теперь отредактируйте базу /etc/monitrc по вашим потребностям (справочный документ). затем создайте файл управления init, чтобы включить monit при запуске. теперь начинайте monit следующим образом:

initctl reload-configuration
start monit

Ответ 12

Я просто использовал php artisan queue:work --tries=3 &, который поддерживает процесс в фоновом режиме. Но иногда это останавливается. Я не знаю, почему это происходит

Изменить

Я решил эту проблему с помощью супервизора. Поместите скрипт супервизора, который запускает этот скрипт php и который будет запускаться каждый раз при запуске сервера