Есть несколько сервисов на симфони, в которые слушают 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() просто пересоздается доктрина.
Но разница на практике есть. Есть здесь знающие внутренности доктрины - в чем же разница?