[php] 치명적인 오류 : 허용 된 메모리 크기 134217728 바이트 소진 (CodeIgniter + XML-RPC)

정기적으로 하나의 중앙 데이터베이스에 새로운 판매 데이터를 전송하는 보고서를 생성하기 위해 하나의 큰 데이터베이스에 데이터를 저장하는 많은 POS 시스템이 있습니다.

클라이언트 POS는 PHPPOS를 기반으로하며 표준 XML-RPC 라이브러리를 사용하여 판매 데이터를 서비스로 보내는 모듈을 구현했습니다. 서버 시스템은 CodeIgniter를 기반으로하며 웹 서비스 구성 요소에 XML-RPC 및 XML-RPCS 라이브러리를 사용합니다. 많은 판매 데이터를 보낼 때마다 (판매 테이블에서 50 행, 세일 내 각 항목과 관련된 sales_items의 개별 행) 다음과 같은 오류가 발생합니다.

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 54 bytes)

의 기본값은 128M php.ini이지만 큰 숫자라고 가정합니다. 사실, 나는이 값을 1024M으로 설정하려고 시도했지만 오류가 발생하는 데 더 오랜 시간이 걸립니다.

내가 취한 단계에 관해서는 서버 측에서 모든 처리를 비활성화하려고 시도했으며 입력에 관계없이 미리 준비된 응답을 반환하도록 조작했습니다. 그러나 문제는 실제 데이터 전송에 있다고 생각합니다. PHP의 최대 스크립트 실행 시간을 비활성화하려고 시도했지만 여전히 오류가 발생합니다.



답변

memory_limitby를 변경하는 것은 올바른 해결책 ini_set('memory_limit', '-1');아닙니다 . 그렇게하지 마십시오.

PHP 코드에 어딘가에 메모리 누수가 발생할 수 있으며 서버가 원하는 모든 메모리를 사용하도록 지시합니다. 문제를 전혀 해결하지 않았을 것입니다. 서버를 모니터링하면 아마도 대부분의 RAM을 사용하고 디스크로 스왑하고 있음을 알 수 있습니다.

코드에서 문제가되는 코드를 추적하여 수정해야합니다.


답변

ini_set('memory_limit', '-1');기본 PHP 메모리 제한을 무시합니다 .


답변

올바른 방법은 php.ini파일 을 편집하는 것 입니다. memory_limit원하는 가치로 편집 하십시오.

귀하의 질문에서 128M(기본 제한)이 초과되었으므로 코드에 그렇게 많이 들지 않아야하므로 코드에 심각한 문제가 있습니다.

왜 그렇게 많이 걸리는지 알고 그 memory_limit = 512M이상 을 허용하고 싶다면 좋을 것입니다.


답변

PHP의 메모리 할당은 영구적으로 또는 일시적으로 조정할 수 있습니다.

영구적으로

PHP 메모리 할당은 두 가지 방법으로 영구적으로 변경할 수 있습니다.

php.ini파일에 액세스 할 수 memory_limit있으면 원하는 값에 대한 값을 편집 할 수 있습니다 .

php.ini파일에 액세스 할 수없고 (웹 호스트가 허용하는 경우) .htaccess파일을 통해 메모리 할당을 무시할 수 있습니다 . 추가 php_value memory_limit 128M(또는 원하는 할당이 무엇이든).

일시적인

PHP 파일 내에서 즉시 메모리 할당을 조정할 수 있습니다. 당신은 단순히 코드 ini_set('memory_limit', '128M');(또는 원하는 할당이 무엇이든)를 가지고 있습니다. 값을 “-1″로 설정하여 메모리 제한을 제거 할 수 있습니다 (머신 또는 인스턴스 제한이 여전히 적용될 수 있음).


답변

특히 ORM과 같은 추상화를 사용하는 경우 PHP 스크립트에서 메모리 누수가 매우 쉽습니다. Xdebug를 사용하여 스크립트를 프로파일 링하고 모든 메모리가 어디로 갔는지 찾으십시오.


답변

array_push를 사용하여 2,250 만 개의 레코드를 배열에 추가 할 때 4Gphp.ini 파일의 메모리 제한으로 사용하여 약 20M 레코드에서 “메모리 소모”치명적 오류가 계속 발생했습니다 . 이 문제를 해결하기 위해 진술을 추가했습니다.

$old = ini_set('memory_limit', '8192M');

파일 상단에. 이제 모든 것이 잘 작동합니다. PHP에 메모리 누수가 있는지 모르겠습니다. 그건 내 일이 아니고 신경도 쓰지 않습니다. 나는 단지 내 일을 끝내야 만했다.

이 프로그램은 매우 간단합니다.

$fh = fopen($myfile);
while (!feof($fh)) {
    array_push($file, stripslashes(fgets($fh)));
}
fclose($fh);

치명적 오류는 메모리 제한을 높일 때까지 3 행을 가리 키므로 오류가 제거되었습니다.


답변

memory_limit에서 설정 한 경우에도이 오류가 계속 발생 php.ini하고로 값을 올바르게 읽습니다 phpinfo().

이것을 다음과 같이 변경하면 :

memory_limit=4G

이에:

memory_limit=4096M

이것은 PHP 7의 문제를 해결했습니다.