Проблема асинхронной очереди Laravel 5.8 с использованием супервизора

Я использую очереди Laravel в своем приложении, у меня есть следующая конфигурация:

.env:

BROADCAST_DRIVER=log
CACHE_DRIVER=file
QUEUE_CONNECTION=database
SESSION_DRIVER=file

config/queue.config

'default' => env('QUEUE_CONNECTION', 'sync'),


'connections' => [

    'sync' => [
        'driver' => 'sync',
    ],

    'database' => [
        'driver' => 'database',
        'table' => 'jobs',
        'queue' => 'default',
        'retry_after' => 90,
    ]
]

У меня есть настройка supervisor, и она имеет следующую конфигурацию

/etc/supervisor/conf.d/laravel_queue.sh

[program:laravel_queue]
process_name=%(program_name)s_%(process_num)02d
command=php /usr/local/bin/run_queue.sh
startsecs = 0
autostart=true
autorestart=true
user=root
redirect_stderr=true
stderr_logfile=/var/log/laraqueue.err.log
stdout_logfile=/var/log/laraqueue.out.log

/usr/local/bin/run_queue.sh

php /var/www/myproject/artisan queue:work --tries=1

Проблема:

Когда я устанавливаю QUEUE_CONNECTION=sync, все работает нормально, но задания выполняются синхронно. Я хочу, чтобы они выполнялись асинхронно. Поэтому, когда я устанавливаю QUEUE_CONNECTION=database, мои задания вообще не выполняются, и я вижу, что они сидят в моей таблице jobs.

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

Любая помощь в этом отношении очень ценится.


person Dakait    schedule 10.06.2019    source источник
comment
Что такое /usr/local/bin/run_queue.sh?   -  person Pablo    schedule 10.08.2019


Ответы (2)


Я не уверен насчет Laravel 5.8, но я установил следующее для Laravel 5.3.

// Define the queue driver
php /var/www/myproject/artisan queue:work database --tries=1

и определил numprocs=1 в файле конфигурации supervisord.

person jogesh_pi    schedule 10.08.2019

Из раздела Queue документации Laravel (5.4):

Настройка супервизора

Файлы конфигурации супервизора обычно хранятся в каталоге /etc/supervisor/conf.d. В этом каталоге вы можете создать любое количество конфигурационных файлов, которые сообщают супервизору, как следует отслеживать ваши процессы. Например, давайте создадим файл laravel-worker.conf, который запускает и отслеживает процесс queue:work:

[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /home/forge/app.com/artisan queue:work sqs --sleep=3 --tries=3
autostart=true
autorestart=true
user=forge
numprocs=8
redirect_stderr=true
stdout_logfile=/home/forge/app.com/worker.log

В этом примере директива numprocs предписывает Supervisor запустить 8 процессов queue:work и отслеживать их все, автоматически перезапуская их в случае сбоя. Конечно, вы должны изменить часть queue:work sqs директивы command, чтобы отразить желаемое соединение с очередью.

Начальный супервайзер

После создания файла конфигурации вы можете обновить конфигурацию Supervisor и запустить процессы, используя следующие команды:

sudo supervisorctl reread

sudo supervisorctl update

sudo supervisorctl start laravel-worker:*

Дополнительные сведения о Supervisor см. в документации по Supervisor.

Краткое объяснение этих команд (источник):

  • перечитать — повторно прочитать конфигурацию супервизора. Не обновляйте и не перезапускайте запущенные службы.
  • обновить — перезапустить службы, конфигурация которых изменилась. Обычно запускается после 'reread'.
  • reload — перечитать конфигурацию супервизора, перезагрузить супервизора и супервизора, перезапустить службы, которые были запущены.
  • restart – перезапустить службы.

Кроме того, эта статья может пролить свет на вашу проблему. Надеюсь это поможет.

person Kenny Horna    schedule 10.08.2019