@HellWalk

Чем отличается EntityManager->clear() от Doctrine->resetManager()?

Есть несколько сервисов на симфони, в которые слушают RabbitMQ (соответственно сервисы крутятся в бесконечном цикле).

Разумеется, в таких случаях надо чистить кэш EntityManager, чтобы php не падал с лимитом памяти.

В части сервисах это сделано через EntityManager->clear(), в части через Doctrine->resetManager()

На первый взгляд кажется, что делается одно и тоже, но, в сервисы с EntityManager->clear() все же периодически падают с лимитом памяти.

Посмотрел код этих методов:

public function clear($entityName = null)
    {
        if ($entityName !== null && ! is_string($entityName)) {
            throw ORMInvalidArgumentException::invalidEntityName($entityName);
        }

        if ($entityName !== null) {
            @trigger_error(
                'Calling ' . __METHOD__ . '() with any arguments to clear specific entities is deprecated and will not be supported in Doctrine ORM 3.0.',
                E_USER_DEPRECATED
            );
        }

        $this->unitOfWork->clear(
            $entityName === null
                ? null
                : $this->metadataFactory->getMetadataFor($entityName)->getName()
        );
    }


public function resetManager($name = null)
    {
        if ($name === null) {
            $name = $this->defaultManager;
        }

        if (! isset($this->managers[$name])) {
            throw new InvalidArgumentException(sprintf('Doctrine %s Manager named "%s" does not exist.', $this->name, $name));
        }

        // force the creation of a new document manager
        // if the current one is closed
        $this->resetService($this->managers[$name]);

        return $this->getManager($name);
    }


На первый взгляд, опять же, никакой особой разницы - clear() вручную сбрасывает все параметры в UnitOfWork, в resetManager() просто пересоздается доктрина.

Но разница на практике есть. Есть здесь знающие внутренности доктрины - в чем же разница?
  • Вопрос задан
  • 2096 просмотров
Решения вопроса 1
Maksclub
@Maksclub
maksfedorov.ru
Я вспомнил, течь в Доктрине может из-за SQL Logger, который в Connection
Когда вы делаете resetManager() — вы убиваете и этот SQL Logger с его объектами в памяти

Вам нужно сделать что-то типа
$this->em->getConnection()->getConfiguration()->setSQLLogger(null);


Это можно сделать на уровне настройки всего контейнера или сервиса, или в команде
Но попробуйте для начала в своей консольной команде!
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы