2009-05-05 2 views
3

PHP에서 '메모리 부족'오류가 발생합니다. 나는 ini_set ("memory_limit", "64M")과 같은 것들로 고칠 수 있지만 스크립트에 대한 많은 메모리가 비정상이기 때문에 원하지 않는다는 것을 알고 있습니다. 나는 너무 거대해서 나는 그 기억을 꽤 많이 필요로한다는 약간의 보고서를 가지고있다. 그러나 일반적으로 그렇게하지는 않는다.허용 된 메모리 크기 * exhausted, bytes of PHP

문제는 다음과 같습니다. 어떤 스크립트가 많은 메모리를 소비하는지 알지 못하고 사용자 (아직)가 오류를보고하지 않았습니다. log_errors (true로 설정) 및 error_log (바탕 화면에 매우 잘 보이는 파일로 설정) 덕분에 이런 일이 일어나고 있지만, 어떤 스크립트가 범인인지는보고하지 않습니다.

어떻게 알 수 있습니까?

+1

웹 서버에서 들어오는 요청과 오류 시간을 비교합니까? 이것은 분당 요청 수가 적다고 가정합니다. – strager

답변

0

스크립트가 32M보다 더 많은 메모리를 먹는 것은 정상입니다. 최근에 특정 이미지 유형의 크기를 조정할 때 그 이상을 소비하려는 GD 라이브러리를 사용하여 문제가 발생했으며 매우 동일한 오류가 발생했습니다. 귀하의 경우에는 메모리를 두 배로 늘리고 실행 시간을 안전한 것으로 제한합니다 (아직 실행되지 않은 경우). .htaccess를 통해 다음 줄을 통해이 작업을 수행합니다.

php_value memory_limit 64M 
php_value max_execution_time 30 
0

이 경우 프로필러가 필요합니다. 나는 xdebug을 선호한다. This article은 PHP 스크립트의 메모리 사용 정보를 얻는 방법을 설명합니다.

3

대용량 데이터 구조 만들기, 다른 구조체로 데이터 재구성, 너무 많은 문자열 조작, 전체 파일로드, 메모리에서의 데이터 재 저장 지난 시간에 검색 한 것입니다. 또한 자국의 많은 데이터베이스 처리기는 데이터 집합 리소스를 제공하는 대신 쿼리에서 반환 된 전체 데이터 집합을 제공합니다. 이것은 원래 의도 한 것보다 더 많은 데이터를 반환 할 수있는 쿼리에 특히 유해합니다.

코드를 프로파일하면 메모리 낭비를 찾기 시작할 수 있습니다. 큰 로깅 데이터 집합을 처리하려면 한 번에 한 줄씩 작업하도록 코드를 구성해야합니다 (예 : 이 아닌 while($data = mysql_fetch_assoc())). 이것은 또한 메모리 소비를 줄이는 버퍼되지 않은 쿼리를 사용할 수있게합니다.

오류 로그에서 사망 한 스크립트를 알려야합니다. Apache 오류 로그가 도움이 될 수 있습니다.

+0

그게 문제입니다. 아파치 오류 로그는 아무것도 표시하지 않습니다. PHP는 스크립트 이름없이 '메모리 부족'오류 만 표시합니다. 스크립트 이름과 함께 고지를보고하도록 PHP를 설정했지만이 특정 오류에는 작동하지 않습니다 (물론 메모리가 부족하고 다른 작업을 수행 할 수 없습니다) –

관련 문제