Как я могу перезапустить диспетчер сущностей доктрины для Symfony 4.2?

Я использую Symfony версии 4.2. Я использую другие пакеты, которые я пишу ниже.

"php": "^7.1.3",
"ext-ctype": "*",
"ext-iconv": "*",
"enqueue/enqueue-bundle": "^0.9.7",
"enqueue/pheanstalk": "^0.9.7",
"friendsofsymfony/elastica-bundle": "^5.0",
"nelmio/cors-bundle": "^1.5",
"nesbot/carbon": "^2.10",
"symfony/console": "*",
"symfony/flex": "^1.1",
"symfony/framework-bundle": "*",
"symfony/orm-pack": "^1.0",
"symfony/serializer-pack": "^1.0",
"symfony/yaml": "*"

Я запускаю команду cosume с помощью супервизора. Ниже я пишу настройки своего супервизора.

[program:devlog-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/project-directory/bin/console enqueue:consume --setup-broker
autostart=true
autorestart=true
user=nginx
numprocs=1
redirect_stderr=true
stdout_logfile=/var/www/project-directory/worker.log

Entity manager закрывается после работы в течение определенного периода времени. Я думаю, мне нужно начать снова. Но я не мог сделать это в коде. Но при перезапуске супервизора все начинает работать. Как я могу решить эту проблему, потому что я не всегда могу перезапустить супервизор с самого начала.

Я пишу пример процесса ниже.

<?php

namespace App\Processor;

use App\Entity\Main\Event;
use Doctrine\ORM\EntityManagerInterface;
use Interop\Queue\Message;
use Interop\Queue\Context;
use Interop\Queue\Processor;
use Enqueue\Client\TopicSubscriberInterface;

class FooProcessor implements Processor, TopicSubscriberInterface
{
    protected $entityManager;

    public function __construct(EntityManagerInterface $entityManager)
    {
        $this->entityManager = $entityManager;
    }

    public function process(Message $message, Context $session)
    {
        try {
            $event = new Event();
            $event->setAction('example');

            if (!$this->entityManager->isOpen()) {
                echo "Entity Manger is closed...\n";
                // here i need to restart the entity manager or another solution
            }

            $this->entityManager->persist($event);
            $this->entityManager->flush();
            $this->entityManager->clear();

            echo "Success\n";
            return self::ACK;

        } catch (\Exception $e){
            echo ($e->getMessage())." \n";
            return self::REJECT;
        }
    }

    public static function getSubscribedTopics()
    {
        return ['aFooTopic'];
    }
}
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
2 279
3

Ответы 3

Если вы заглянете в исходники Doctrine - вы увидите (1, 2), что EntityManager закрываются в случае, если в контексте транзакции возникло какое-то исключение.

Это означает, что если ваш EntityManager закрывается - возможно, что-то не так с приложением или базой данных (например, соединение с базой данных было потеряно или возникла какая-то несогласованность данных и т. д.). Из исходников Doctrine вы также можете видеть (1, 2), что исключение генерируется в случае EntityManager закрытия, поэтому, изучив ваши источники, вы должны увидеть, что это исключение повторяется сразу после закрытия.

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

Встроенного способа повторно открыть закрытый EntityManager нет, но поскольку состояние «закрытое» — это просто флаг внутри Doctrine — его можно очистить через Reflection:

$reflection = new \ReflectionObject($this->entityManager);
$prop = $reflection->getProperty('closed');
$prop->setAccessible(true);
$prop->setValue($this->entityManager, false);
$prop->setAccessible(false);

но это «хакерский» способ, и я бы не рекомендовал его до тех пор, пока в этом нет крайней необходимости.

Проблема решилась изменением настроек супервизора. Я пропустил настройку.

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

[program:devlog-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/project-directory/bin/console enqueue:consume --setup-broker --env=prod --no-debug --time-limit = "now + 5 minutes"
autostart=true
autorestart=true
user=nginx
numprocs=1
redirect_stderr=true
stdout_logfile=/var/www/project-directory/worker.log

Спасибо

Я считаю, что вы ищете DoctrinePingConnectionExtension для библиотеки постановки в очередь.

Вот конфигурация services.yaml, необходимая для этого:

services:
    app.enqueue.doctrine_ping_connection_extension:
        class: 'Enqueue\Bundle\Consumption\Extension\DoctrinePingConnectionExtension'
        tags:
            - { name: 'enqueue.consumption.extension', priority: 10, client: 'all' }

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