Утечка памяти в PHP с Symfony + Doctrine - PullRequest
1 голос
/ 04 июня 2010

Я использую PHP со структурой Symfony (с Doctrine в качестве моего ORM) для создания паука, который сканирует некоторые сайты.

Моя проблема в том, что следующий код генерирует утечку памяти:

$q = $this -> createQuery('Product p');

if($store) {
    $q
        -> andWhere('p.store_id = ?', $store -> getId())
        -> limit(1);
}

$q -> andWhere('p.name = ?', $name);

$data = $q -> execute();
$q -> free(true);
$data -> free(true);
return NULL;

Этот код помещен в подкласс Doctrine_Table. Если я закомментирую часть выполнения (и, конечно, $data -> free(true)), утечка прекратится. Это привело меня к выводу, что утечка вызвана Doctrine_Collection.

Ответы [ 4 ]

5 голосов
/ 07 июня 2010

Я решил свои проблемы с утечками памяти в Doctrine, освободив и несобственные данные, вы пробовали это?

// ...
$data->free(true) ;
unset($data) ;
// ...
1 голос
/ 05 июня 2010

Какую версию PHP вы используете? Если это <5.3, это, вероятно, связано с ошибкой <a href="http://bugs.php.net/bug.php?id=33595" rel="nofollow noreferrer"> 'утечка рекурсивных ссылок' .

Вы также можете попытаться позвонить Doctrine_Manager::connection()->clear(), который должен очистить соединение и удалить записи карты идентификации

0 голосов
/ 25 марта 2014

Я просто сталкиваюсь с той же проблемой с командой CLI, которая выполняется постоянно. Потратив много часов на устранение этой проблемы, выясняется, что запуск моих команд в режиме prod фактически решил проблему:

app/console my:custom:command --env=prod
0 голосов
/ 04 июня 2010

Должны ли вы использовать addWhere вместо andWhere? Также я считаю, что в конце выписки следует добавить ограничение, попробуйте:

$q = $this -> createQuery('Product p') -> where('p.name = ?', $name);

 if($store) {
$q
    -> addWhere('p.store_id = ?', $store -> getId())
    -> limit(1);
 }

 $data = $q -> execute();
 $q -> free(true);
 $data -> free(true);
return NULL;
...