Я использую Symfony 1.4 и Доктрину.
До сих пор у меня не было проблемных выполняющихся задач с Symfony. Но теперь, когда я должен импортировать довольно большой объем данных и сохранить их в базе данных, я получаю печально известное
"Фатальная ошибка: Позволенная емкость памяти XXXX байтов исчерпывается"
Во время этого импорта я только создаю новые объекты, устанавливая несколько полей и сохраняя их.
Я вполне уверен, это имеет некоторое отношение к количеству объектов, которые я создаю при сохранении данных. Сбрасывание тех объектов ничего не делает все же.
Там какие-либо лучшие практики должны ограничить использование памяти в Symfony?
Я столкнулся с этим, и я обнаружил, что есть несколько приемов, которые действительно помогли с обширным использованием памяти 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 ()
не очищает циркулярные ссылки в противном случае.