2009-04-21 8 views
1

그래서 매우 이상한 문제가 있습니다.PHP가 메모리 한계에 도달하면 함수가 다시 실행됩니다.

먼저 PHP 5.2.6을 사용합니다 (MAMP의 일부로, 5.2.6을 실행하는 LAMP 서버에서도 발생하지만). Zend Framework 1.7.2를 사용하여 웹 사이트를 작성합니다.

둘째, 필자가 작성한 소프트웨어는 많은 메모리가 필요한 다소 복잡한 통계 계산을 수행합니다. 일반적으로 메모리 제한으로 설정된 128MB로 정상적으로 실행됩니다.

여기 재미있는 부분이 있습니다.

필자는 필요한 데이터를 얻고, 필요한 계산을 수행 한 다음 값을 반환하는 일을 전적으로 담당하는 클래스를 가지고있다. 그것이 실행 된 후, 나는 그것을 풀어 놓았다. PHP는 여전히 범위 내에 있고 그것이 호출되는 함수를 완료 함에도 불구하고 메모리를 유지한다고 생각하는 것 같다. (이것은 계산의 두 번째 실행이 문제가되는 원인이되었다. 기억 한계를 치고 대본은 죽었다). 이 계산이 해당 함수 내에서 한 번 실행되면 다른 계산에서 다시 실행되어 실행됩니다 (동일한 실행 실행 중에 있음). 상황이 이상하게 변하는 곳이 있습니다.

두 번째 계산을 실행하면이 계산을 수행하는 코드 내에서 함수에 대한 호출이 전혀 없음에도 불구하고 호출 함수가 다시 실행됩니다. 또한 PHP에는 오류나 경고가 표시되지 않습니다.

그러나 메모리 제한 (예 : 1024MB)을 늘리면 이 발생하지 않습니다. 전체 호출 기능이 한 번 실행되고 메리 방식으로 계속됩니다.

그래서 아래지도를 그려 보겠습니다. (호출자에게 및)은 다음과 같이 128MB 메모리와

function A{ 
    calls function B 
    calls function D 
} 

function B{ 
    calls calculation function C 
} 

function D{ 
    calls calculation function C 
} 

는, 기능 경로는 다음 A-> B-> C-> B-> A-> D-> C-> D-> 그러면 함수의 시작에서 어떤 이유로 든 끝까지 A를 실행합니다 (이 실행 경로 중에 true가되어 경로가 반복되지 않는 조건문이 있음)

및 1GB 메모리 함수의 경로는 다음과 같습니다. A-> B-> C-> B-> A-> D-> C-> D-> A의 끝입니다.

함수 D에서 두 번째 계산을 제거하면 작동합니다. 메모리 한도를 초과하면 작동합니다.

질문 : PHP 메모리 관리에서 버그를 발견 했습니까? 아니면 젠드 프레임 워크에서? 다시; php.ini에서 스크립트 당 메모리 제한을 늘림으로써이 문제가 보이지 않습니다. 즉, 많은 메모리를 사용하는이 계산을 실행하는 두 번째 인스턴스를 제거하십시오.

저는이 방법이 이상하게 보입니다. (이런 종류의 호출 함수는 처음에는 다시는 보지 못했습니다). 보통이 경우에 일어날 일은 PHP가 오류를 발생시키고 죽을 것이고, 호출 함수를 다시 시작하지 않을 것이라는 것입니다.

+1

PHP 오류보고 기능은 무엇입니까? 경고 또는 오류가 표시되지 않으면 너무 낮게 설정되었을 수 있습니다. 니가 뭔가를 얻어야하는 것 같아. E_ALL과 E_STRICT를 켜고 어쩌면 더 많은 것을 알려주는지보십시오. –

+0

실제로 우리는 더 많은 것을 얻습니다. Out-of-Memory 오류가 발생했습니다! 이상하게도 때때로 OOM 오류가 발생했지만 지금은 매번 오류가 발생합니다. 이제 우리는 치명적인 PHP 오류가 오류가 발생한 곳에서 함수를 호출 한 함수를 재실행하는 흥미로운 사건이 발생했습니다. 이것은 적절한 행동입니까? PHP는 치명적인 오류로 인해 죽지 않아야합니까? – jedcred

+0

나는 궁금하다 : 원인은 무엇인가? – soulmerge

답변

0

먼저 (모두 E_STRICT 포함)을 켜십시오.

예상치 못한 실행 경로가 메모리 부족으로 인해 발생할 수 있으며 추가 오류 출력이 더 많은 빛을 낼 수 있다고 생각됩니다.

+0

질문에 대한 의견보기. – jedcred

1

debug_backtrace()을 사용하여 프로그램 흐름을 확인 했습니까?나는 당신의 PHP 코드가 zend 엔진보다이 코드의 원인이라고 생각한다. 각 함수의 시작 부분에 파일의 덤프를 파일로 저장하고 그 파일을 먼저 분석하는 것이 좋습니다.

+0

샷을 줄 것입니다. – jedcred

관련 문제