Задания Laravel оставляют бездействующий процесс postgresql при DEALLOCATE

Каждый раз, когда на моем сервере запускается отложенное задание, я вижу новый незанятый процесс в postgreSQL. Запустив select * from pg_stat_activity;, я вижу:

DEALLOCATE pdo_stmt_00000018

Я пытался понять, и каждый раз, когда только что запускалось отложенное задание в очереди, появляется еще одна строка (и еще один процесс в htop).

Последняя строка моей работы:

$this->log->info("Invitation {$this->invitation->uuid} sent");

И я вижу это в своих журналах, так что все в порядке, НО это не очищается после. У меня каждый раз простаивает процесс с «DEALLOCATE pdo_stmt_00000xxx».

Что я могу сделать, чтобы избежать этой проблемы? Чем это вызвано?

Вот мой конфиг супервайзера:

[program:laravel-queue-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /path/to/my/site/artisan queue:work --queue=invitation,default --sleep=3 --tries=3
autostart=true
autorestart=true
user=www-data
numprocs=2
redirect_stderr=true
stdout_logfile=/path/to/my/logs/worker.log

Примечание: незанятые процессы исчезают, когда я запускаю php artisan queue:restart


person rap-2-h    schedule 16.03.2017    source источник
comment
кажется, что подготовленный оператор освобождается, чтобы иметь возможность повторно использовать это имя pdo_stmt_00000xxx, и не завершает соединение? может быть, он предназначен для запуска pgbouncer с режимом пула пользователей, установленным на транзакцию?..   -  person Vao Tsun    schedule 16.03.2017


Ответы (1)


Я нашел (быстрый и грязный) обходной путь. Добавив это в конец моей функции дескриптора задания:

\DB::disconnect();
sleep(1);

В Laravel открыт вопрос: https://github.com/laravel/framework/issues/18384

person rap-2-h    schedule 17.03.2017