2014-04-08 6 views
0

매일 symfony 1.4 작업에 문제가 있습니다. 작업을 간단하게 만들려면 xml을 다운로드 한 다음 읽어보십시오.symfony 작업에서 메모리 누수가 발생했습니다.

사용 된 메모리가 xml의 각 "노드"사이에서 증가한다는 것을 알고 있습니다.

예를 들어, 어딘가 스크립트에서 내가 할 것을 :

foreach($prd->ArtistList->Artist as $art) 
      { 
    echo "start foreach artist ", memory_get_peak_usage(1), " bytes of ram.\n"; 
      if(!$artist = ArtistTable::getInstance()->findOneByRoleAndName($art['role'], $art['name'])) 
      { 
       $artist = new Artist(); 
       $artist->role = $art['role']; 
       $artist->name = $art['name']; 
       $artist->save(); 
      } 

      if(!$pha = ProductArtistTable::getInstance()->findOneByProductIdAndArtistId($prd_id, $artist->id)) 
      { 
       $pha = new ProductArtist(); 
       $pha->product_id = $prd_id; 
       $pha->artist_id = $artist->id; 
       $pha->save(); 
      } 

      $pha->free(true); 
      $artist->free(true); 
      unset($pha); 
      unset($artist); 

      echo "end foreach artist ", memory_get_peak_usage(1), " bytes of ram.\n"; 
      } 
      unset($art); 

나는 두 memory_get_peak_usage (1) 끝과 시작, 메모리 사용의 증가 사이에 ... 내가 또 뭘 모르는 것을 볼 수 있습니다 나는 같은 수준으로 유지하기 위해 노력합니다 ...

어떻게 해결할 수 있습니까?

감사합니다.

답변

1

심포니 응용 프로그램 내에서 느린 성능을 모니터링했습니다. ORM (내 경우에는 Doctrine) 쿼리 메서드에서 빌드 된 것들이 특히 foreach 루프 내에서 나쁜 것임을 알았습니다.

대신 RAW SQL을 사용해 보시기 바랍니다. 이 트릭을

$connection = Doctrine_Manager::connection(); 
$statement = $connection->prepare('your sql statement'); 
$statement->execute(); 
$result = $statement->fetchAll(PDO::FETCH_NUM); // or whatever fetch mode you want to use 
+0

감사해야 심포니에서 원시 SQL을 사용하는 방법을 모르는 경우

나는 예를 들어, 그것을 시도하고 당신이 – user3430056

+0

메모리는 여전히 증가하고있다 :) 알려 것이다 I 주의 사항 : foreach artist 214695936 바이트의 RAM을 시작하십시오. foreach 아티스트 214958080 바이트의 RAM. 어떻게 그것이 증가하고있을 수 있습니다 ... 나를 미친 운전,) – user3430056

+0

그것은 PHP 그래서 당신은 예를 들어에서 메모리를 제어 할 필요가 없어. C. 연결 정보, 쿼리, 프레임 워크 변수 등으로 유지되는 변수가있을 수 있습니다. 메모리 사용량과 같은 문제가 있으면 프레임 워크를 사용하지 않아도됩니다. 나에게 보통 Doctrine 수화를 건너 뛰는 것은 로미가'execute (array(), Doctrine_Core :: HYDRATE_NONE)'을 호출하거나 제안 할 때 네이티브 SQL을 사용하여 많은 RAM을 절약하기에 충분했다. –