Я сталкивался с этим, и я нашел несколько техник, которые действительно помогли с большим использованием памяти в Doctrine.
1: где возможно, упорядочьте результаты запроса Doctrine до массива. Вы можете сделать это следующим образом, например:
$query = self::createQuery("q")->
...
->setHydrationMode(Doctrine::HYDRATE_ARRAY)
->execute();
Это заставляет Doctrine НЕ создавать большие объекты, а вместо этого уменьшает его до массива. Очевидно, имейте в виду, что если вы сделаете это, вы потеряете способность вызывать методы и т. Д., Так что это хорошо, только если вы используете это для чтения значений полей и т. Д.
2: освободить результаты после выполнения. Это задокументировано в крошечной области документации по Doctrine, но это действительно помогло выполнить задачу импорта, которую я использовал:
$query->free();
Вот и все. Вы также можете сделать это на объектах, которые вы создали, например $myObj->free();
, и это заставит Doctrine удалить все циклические ссылки, которые он создает. Обратите внимание, что циклические ссылки автоматически удаляются из PHP 5.3 и далее при удалении объекта через область видимости PHP или unset()
, но перед этим вам нужно будет сделать это самостоятельно.
Сброс переменных после того, как вы их использовали, также помогает, хотя делайте это в сочетании с вышеописанным методом free()
, так как unset()
не очистит круговые ссылки в противном случае.