2010-06-04 6 views
1

Symfony 프레임 워크 (Doctrine을 ORM으로 사용)와 함께 PHP를 사용하여 일부 사이트를 크롤링합니다. 이 코드는 Doctrine_Table의 서브 클래스에 배치됩니다Symfony + Doctrine을 사용하여 PHP에서 메모리 누수가 발생했습니다.

$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; 

:

내 문제는 다음과 같은 코드는 메모리 누수가 발생한다는 것입니다. 실행 부분 (물론 $data -> free(true))을 주석 처리하면 누출이 중지됩니다. 이로 인해 누출의 원인이되는 것은 Doctrine_Collection이라는 결론에 도달했습니다.

답변

5

정체성 맵 항목을 제거 할 수 있습니까?

// ... 
$data->free(true) ; 
unset($data) ; 
// ... 
+0

실제로 작동했습니다! 이상하게도 PHP 자체로 정리해야합니다. 대신 CakePHP를 대신 사용하면 좋을 것 같습니다. :) 나는 $ (unset ($ q))를 추가 할 수 있습니다. –

0

대신에 andWhere 대신 addWhere를 사용해야합니까? 또한 진술 문 끝에 한계를 추가해야한다고 생각합니다.

$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; 
+1

addWhere 및 andWhere 서로의 동의어와 동일하게 작동, 변경 사항은 메모리에 아무런 차이를하지 새는 곳. –

+1

쿨, didnt는 add/andWhere에 관해 그것에 관해 안다 나는 미안하다 나는 어떤 도움이라도의 것이 될 수 없었다. – Luke

+0

아무런 문제가 없습니다. 시도해 주셔서 감사합니다 :) –

1

어떤 PHP 버전을 사용하고 있습니까? < 5.3이면 아마도 'recursive references leak memory' 버그와 관련이 있습니다.

또한 연결하는을 정리해야 Doctrine_Manager::connection()->clear() 전화를 시도하고 당신이 그것을 시도 않았다 unseting 데이터를 확보하여 교리 메모리 누수 내 문제를 해결

+0

5.3.2를 사용하고 있습니다. Doctrine_Manager :: connection() -> clean()이 맞습니까? API에서 찾을 수 없으며 호출 할 수 없습니다. –

+0

죄송합니다. Doctrine_Manager :: connection() -> clear();가되어야합니다. – Intru

+0

아무런 차이가 없었습니다 : ( –

0

계속 실행되는 CLI 명령과 동일한 문제가 발생합니다. 이 prod 모드에서 내 명령을 실행 실제로 문제를 해결 밝혀이 문제를 해결하기 위해 많은 시간을 소비 한 후 :

app/console my:custom:command --env=prod 
관련 문제