2009-11-17 16 views
3

"치명적인 오류 : 메모리가 부족합니다 (할당 된 30408704) (24 바이트를 할당하려고했습니다.). . "PHP 치명적인 오류. Apache를 통해 제공되는 페이지는이 동작을 나타내지 않습니다.PHP 명령 줄 스크립트가 php.ini 및 ini_set ('memory_limit', ...) 지시문을 무시합니다.

  1. 훨씬 더 큰 값으로 php.ini 파일에서 memory_limit를 증가 :

    나는 다음과 같은 시도했습니다.

  2. 메모리를 확보하기 위해 가비지 컬렉터를 장려하기 위해 불필요한 배열과 객체를 보내고, ini_set('memory_limit', -1)에 호출을 통해 스크립트 자체 내에서 ini_set('memory_limit', '-1'), ini_set('memory_limit', 100000000), ini_set('memory_limit', '128M')
  3. unset()을 memory_limit를 증가.
  4. 웹 호스트에 문의 중입니다. 그들은 일반적으로 매우 유능하고 지식이 풍부하지만이 문제에 대해서도 저를 도울 수 없었습니다.
  5. -c 명령 줄 플래그를 사용하여 php.ini 파일을 명시 적으로 시도하여 다양한 값으로 특정 php.ini 파일을 직접 선택했습니다.
  6. 나는 원시 바이트 수와 64M, 128M 등의 값을 모두 사용하여 php.ini에서 memory_limit을 설정해 보았습니다.
  7. 호스팅 제공 업체는 문제없이 루트로 스크립트를 실행할 수 있었지만 내 비 루트 사용자를 사용하여 실행할 때도 동일한 문제가 발생합니다. 아마도 어떤 종류의 사용 권한 문제가 관련되어 있습니까?

내가 시도한 것과 관계없이 오류 메시지는 같습니다. 내 명령 행 스크립트가 memory_limit의 변경 사항을 무시하는 것 같습니다.

필자의 스크립트가 메모리 효율을 높이는 경향이 있지만, 현재 Simple HTML DOM을 통해 많은 양의 HTML을 구문 분석해야하며 파서에 메모리 문제가 발생했습니다. 스크립트의 메모리 사용량을 줄이기 위해 대신 DOMDocument을 사용해 보았습니다. 이것은 도움이되지 않습니다. 실제로 메모리 부족 오류는 이제 스크립트의 다른 위치에서 트리거됩니다.

내 질문 :이 문제가 발생 했습니까? 추천이 있으십니까?

감사합니다.

+0

좋아, 이것은 훨씬 더 어렵지만 무한 루프에 대한 코드를 확인해야 할 것입니다. 나는 divide-and-conquer debug를 권장한다. "Out of Memory"오류를 발생시키는 코드의 예를 들어 보겠습니다. function returnSomething ($ what) {return return return return return return return return } returnSomething (true);'will dump '치명적 오류 : 134217728 바이트의 메모리 크기가 소모되었습니다 (261900 바이트 할당 시도) ...' – Dereleased

+0

주사위가 없습니다. 내 호스팅 계정 관리자는 루트 사용자로 아무 문제없이 내 스크립트를 실행할 수있었습니다. 또한, 내 스크립트는 내 로컬 dev 컴퓨터에서 잘 실행됩니다. – jkndrkn

답변

7

이 문제는 모든 명령 줄 스크립트에 하드 메모리 제한을 설정 한 서버에서 셸 포크 폭탄 보호가 활성화되어있는 것으로 밝혀졌습니다. 내 지식없이 내 웹 호스트에 의해 활성화되었습니다.

3

귀하의 PHP on cli가 귀하의 아파치 PHP에 대해 다른 php.ini를 사용 중일 수 있습니다. phpinfo()을 시도하고 사용하는 ini 파일을 사용하여 확인하십시오.

+1

+1 : 제 경험상 대개 이것은 문제입니다. – Powerlord

+0

고마워요.하지만 이미 시도해 봤습니다. – jkndrkn