PHP Fatal error: Allowed memory size of 134217728 bytes exhausted
※ 업무하면서 습득한 내용들을 정리해 놓은 포스팅입니다 :P 추가로 궁금하신 점은 댓글로 남겨주시고 필요한 자료 있으면 요청주세요! 잘못된 내용이 있으면 고쳐주시면 감사하겠습니다. 자료 퍼가실 때는 출처 남겨주세요!
ο 목차
※ 코드 보는 방법 참고
ㅇ 달러 기호($)가 있는 경우 -> 리눅스 터미널에서 CLI 명령어 입력
ㅇ "=#" 기호가 있는 경우 -> psql 쉘에서 명령어 입력
ㅇ 꺽쇠가 하나 있는 경우(>) -> 윈도우 명령 프롬프트(cmd)에서 명령어 입력
ㅇ 꺽쇠가 세개 있는 경우(>>>) -> python 쉘에서 명령어 입력
1. 문제 사례
PHP 파일 실행 도중 할당 메모리 초과와 관련된 Fatal error 발생
2. 오류 메세지 내용 상세
PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 72 bytes) in /usr/share/php/tcpdf/include/tcpdf_static.php on line 1219
3. 문제 원인
1) 오류가 발생하는 이유
PHP 스크립트는 악성코드로 인한 메모리 소모 공격을 방지하기 위해 스크립트 실행시 기본값 128MB 이상의 메모리를 사용하지 못하도록 제한하고 있음. 스크립트 실행시 128MB 이상의 메모리를 사용하는 경우 해당 오류 메세지가 출력됨.
2) 오류 케이스 1 : 대량의 파일 처리
용량이 큰 파일을 처리하거나, 파일 업로드가 필요한 경우 128MB 이상의 메모리를 사용하게 되어 발생
3) 오류 케이스 2 : 잘못된 코드
일반적인 경우라면 PHP 스크립트는 최대 128MB 메모리 안에서 동작하는 것이 정상이며, 128MB를 넘으면 안됨. 대량의 파일을 처리하는 경우가 아닌데도 해당 오류가 발생했다면 무한 루프가 돌거나 하는 등의 잘못된 코드로 인한 메모리 소모 발생 가능성이 있음.
4. 문제 해결 방법
1) 단일 php 스크립트 허용 메모리 늘리기(ini_set 함수 사용)
php 코드 내에서 ini_set 함수를 사용하여 해당 스크립트 실행시 사용가능한 메모리 크기 늘리기
<?php
ini_set("memory_limit","256M");
?>
※ ini_set("memory_limit","허용할_메모리_크기");
※ 허용할_메모리_크기를 -1 로 설정하는 경우 메모리 제한 없이 사용할 수 있으나 권장하지 않음. 허용할 메모리 크기는 오류가 발생하지 않는 최소값으로 설정하는 것을 권장함.
2) 모든 php 스크립트 허용 메모리 늘리기(php.ini 파일 수정)
php.ini 파일 내의 "memory_limit" 항목을 찾아서 허용할 메모리 크기값 수정하기
※ 아래는 php.ini 파일 위치 찾는 방법(참고)
터미널에서 php --ini 입력 후 php.init 위치 확인
>> 예시)
터미널에서 php --ini 입력 후 php.init 위치 확인
>> 예시)

(1) php.ini 파일 편집창 열기
$ vi 경로/php.ini
(2) php.ini 파일 내용 중 "memory_limit" 항목 수정하기
(php.ini 파일 내용 수정 전)
; Maximum amount of memory a script may consume (128MB)
; http://php.net/memory-limit
memory_limit = 128M
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Error handling and logging ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(php.ini 파일 수정 후)
; Maximum amount of memory a script may consume (128MB)
; http://php.net/memory-limit
memory_limit = 256M
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Error handling and logging ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3) 메모리 사용량 감시하며 코드 확인하기(memory_get_usage() 함수 사용)
만약 코드에 문제가 있다고 생각되는 경우라면 코드 중간중간 메모리 사용량을 출력해서 어느 부분에서 불필요한 메모리 소모가 발생하는지 확인할 필요가 있음.
php 함수 중 memory_get_usage() 함수값을 echo 해서 코드 중간중간 메모리 사용량을 출력할 수 있음.
<?php
echo memory_get_usage();
?>
memory_get_usage() 함수는 함수가 선언된 시점에서 php 코드가 사용하고 있는 메모리 사용량을 정수 형태로 반환함.
코드 어디에서나 몇 번이든 선언될 수 있으며, 루프 중에도 선언 가능.
해당 함수를 메모리 누수가 의심되는 구간마다 배치(?) 해서 코드 실행 중 메모리 사용량 모니터링 후 문제가 되는 구간의 오류를 수정해야 함.
※ 좋아요와 구독은 큰 힘이 됩니다. 감사합니다.