Я использую 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'];
}
}





Если вы заглянете в исходники 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' }