2012-02-09 5 views
0

이것은 상당히 논의 된 것 같습니다. 나는 내가 찾은 몇 가지 것을 시도했지만 운은 없다.PHP - 혜성 메모리 문제

XML 호출에서받은 객체를 저장하는 "해킹"캐시가 내장되어 있습니다. XML 호출은 페이지로드에 너무 오래 걸리는 것으로 판명되었으므로 사용자는 관리자의 버튼을 눌러 캐시를 다시 작성할 수 있습니다. 캐시 루틴은 메모리 할당 오류로 인해 계속 죽어갑니다.

나는 이것이 매우 모호한 질문이라는 것을 알고 있지만 큰 부분의 코드를 게시하는 데 도움이 될지 확신하지 못합니다.

사용을 마친 후에 나는 모든 설정을 해제하고 있습니다. gc_collect_cycles()는 아무것도하지 않는 것 같습니다.

나는 두명 이상의 익명의 함수를 가지고 있는데,이 함수는 이상으로 호출된다 .... 이들은 범인이 될 수 있을까?

무엇을 찾고 있습니까? 수면() 도움이 전혀 도움이 되겠습니까? http://pastebin.com/8M1Dk73E

페이스트 빈 코드의 라인 79에, 내가 전화 한 gc_collect_cycles : 여기에 코드 편집

는 코드입니다. 그것이 좋은 장소인지 아닌지 확실하지 않습니다.

for 루프 대신 foreach 루프를 사용하고 있는데, 이는 복사되는 개체와 큰 차이가 있음을 알고 있지만 실행 시간이 길어질지라도 변수를 설정 해제하면 동일하게 작동해야한다고 생각합니다.

글쎄, 나는 손실에 처해있어 어떤 생각이 도움이 될 것입니다.

+0

몇 가지 질문 : 얼마나 많은 메모리가 PHP에 할당됩니까? 오류 메시지를 인쇄 할 수 있습니까? 항목을 가져 오는 순서를 변경하는 동안 10 번 실행하면 일반적으로 동일한 행 번호 (큰 메모리 잡기를 담당하는 코드 일 수 있음)에서 만료됩니까? 코드의 큰 덩어리를 실제로 볼 수 있습니다 :) –

+0

128MB 할당 됨, 오류 : "치명적 오류 : 허용 된 메모리 크기 134217728 바이트가 소모되었습니다 (5426168 바이트 할당) ..."실제로 죽습니다 나는 매번 같은 줄에서 코드와 관련해서는 기쁘다 고 인정합니다. 메모리를 늘릴 다른 방법을 모르겠습니다. 이것은 제가 말할 수있는 것이 아닙니다. 아, 우리는 메모리 크기를 늘리고 하루라고 부릅니다. 검색되는 데이터의 크기가 일부 사람들에게는 엄청날 수 있기 때문입니다. –

답변

1

이것은 gc_collect_cycles과 관련이있을 수 있습니다. 일부 PHP 버전과 일부 루프 조건에서는이 함수가주기를 수집하지 못합니다. 예를 들어 https://bugs.php.net/bug.php?id=53803https://bugs.php.net/bug.php?id=53071

PHP를 5.3.9로 업데이트하고 작동하는지보십시오. 그렇지 않다면 컬렉션을 삭제하고 unset()에 독점적으로 의존하십시오 (전역 변수를 설정 해제하면 함수 내에서 변수가 삭제된다는 것을 명심하십시오). 모든 것을 파괴하려는 경우 $ GLOBALS 배열에서 설정을 해제해야합니다.

아직 막혔다면 메모리를 필요하거나 제거해야하는 메모 뒤에 memory_get_usage()를 사용하여 루프를 따라 이동할 때 메모리를주의 깊게 추적 해보십시오. 다음과 같음 :

try{ 
    $result = $client->GetListingPhotosWithFullPath(array('mlsID'=>$bid->MlsID, 'mlsNumber'=>$bid->MlsNumber)); 
    echo "Got Photos with Full Path on line ".__LINE__." - Now using ".memory_get_usage()."<br />\n"; 
    $listing->photos = $result->GetListingPhotosWithFullPathResult->Photo; 
    echo "Setting $listing->photos on ".__LINE__." - Now using ".memory_get_usage()."<br />\n"; 
    (isset($opt->comet)) ? $msg("Photos received.") : ''; 

    //Memory Cleanup 
    unset($result); 
    echo "\$result unseet on ".__LINE__." - Now using ".memory_get_usage()."<br />\n"; 
} 

이렇게하면주기가 어디에서 메모리를 구성하는지 확인할 수 있습니다.

+0

글쎄, 난 아직도 붙어 있지만, 이것이 또 다른 질문이라고 생각합니다.메모리 문제는 필자가 결국 파일에 쓰는 배열을 빌드 할 때 발생합니다. 모든 것을 가져 와서 파일에 쓰는 데 충분할만큼 메모리에 배열을 유지할 수 없습니다. ( –

+0

배열에서 모든 것을 보관하는 것보다는 비트 단위로 파일을 빌드 해 볼 수 있습니까 : 'file_put_contents ($ filename, $ data, FILE_APPEND);'그리고 그 데이터 조각을 설정 해제 하시겠습니까? –