PHP 메모리 부족 오류 해결: memory_limit 늘리기
문제 상황: 에러 예시
다음과 같은 에러가 표시되는 경우가 흔합니다:
PHP Fatal error: Out of memory (allocated 49545216) (tried to allocate 77824 bytes) in /home/xxxxx/public_html/xyz/admin.php(1758) on line 40
위 오류는 특정 PHP 스크립트가 PHP에 할당된 메모리보다 더 많은 메모리를 요구했을 때 발생합니다. 즉, memory_limit 설정을 늘리거나 스크립트/구성 문제를 해결해야 합니다.
왜 일시적으로 Apache 재시작으로 해결되나
서버에서 메모리 누수나 일시적 과부하로 프로세스가 비정상 상태가 될 수 있습니다. Apache(httpd) 재시작은 모든 워커 프로세스를 새로 시작해 즉시 증상을 없애지만, 근본 원인은 남아 있으므로 영구 해결로 보아선 안 됩니다.
중요: 재시작은 임시 조치입니다. 원인 분석 없이 반복하면 동일 문제가 재발합니다.
영구 해결 — memory_limit 늘리는 4가지 방법 (우선순위 권장)
php.ini 수정 (권장)
- 시스템에서 실제로 사용되는 php.ini 파일 위치를 확인하려면 웹 루트에 다음 파일을 만드세요.
- 브라우저로 해당 파일을 열면 “Loaded Configuration File” 항목에 실제 php.ini 경로가 표시됩니다(예: /usr/local/lib/php.ini 등).
- 텍스트 편집기로 php.ini를 열고
memory_limit
값을 찾습니다. 예:
memory_limit = 8M
- 필요에 따라 값을 증가시킵니다. 예:
memory_limit = 32M
또는memory_limit = 64M
등. - 변경 후 Apache 또는 PHP-FPM을 재시작하세요:
sudo systemctl restart httpd
또는sudo systemctl restart php-fpm
.
런타임에서 메모리 제한 변경 (임시 또는 스크립트별)
- php.ini에 접근할 수 없을 때, 문제가 발생하는 PHP 파일 상단에 다음을 추가할 수 있습니다:
ini_set('memory_limit', '32M');
- 이 방법은 해당 스크립트 또는 요청 범위에만 적용되며, 서버 전체 설정을 바꾸지 않습니다.
.htaccess에 설정 추가 (Apache + mod_php 환경)
- .htaccess에 아래 줄을 추가하면 디렉터리 단위로 적용됩니다(단, 호스트가 AllowOverride로 허용해야 함).
php_value memory_limit 32M
WordPress의 경우 wp-config.php에서 설정
- 워드프레스 사이트라면 다음을 wp-config.php에 추가해 WP가 요청하는 메모리를 늘릴 수 있습니다:
define('WP_MEMORY_LIMIT', '32M');
언제 어떤 방법을 먼저 선택할까 (의사결정 요약)
- 서버 전체 영향을 주려면 php.ini 수정이 최선입니다.
- 특정 플러그인/스크립트 문제면 ini_set()로 테스트하세요.
- 공유호스팅에서 php.ini 접근 불가하면 .htaccess나 wp-config.php를 시도하세요.
- 위 모두 실패하면 호스팅 업체에 문의하세요.
문제 해결 체크리스트 (역할별)
개발자 / 관리자:
- phpinfo()로 loaded php.ini 경로 확인
- php.ini에서 memory_limit 값 확인 및 백업 후 수정
- 변경 후 Apache/PHP-FPM 재시작
- 스크립트에서 불필요한 메모리 할당(대량 배열, 파일 버퍼링 등) 제거
- 메모리 요구가 과도한 코드(루프, 재귀, 대용량 파일 처리) 리팩터링
호스팅 관리자 / 운영자:
- 서버 로그(예: /var/log/httpd/error_log, PHP-FPM 로그)에서 메모리 오류 패턴 확인
- 리소스 제한(ulimit, cgroups) 확인
- 과도한 동시 접속/백그라운드 작업 여부 확인
원인 분석: 어떤 스크립트가 메모리를 많이 쓰는지 찾는 방법
- 에러 로그의 파일명과 라인 번호 확인 (예: admin.php(1758) on line 40).
- 해당 부분을 검토해 대용량 배열, 파일 전체 로드, 이미지 처리, 외부 API 반복 호출 등을 찾아라.
- Xdebug나 New Relic 같은 APM(애플리케이션 성능 모니터링) 도구로 메모리 프로파일링을 수행하면 원인 파악이 쉬워집니다.
- 스크립트를 분해하여 작은 입력/작동 단위로 테스트해 메모리 증가 지점을 재현하세요.
대안 접근법 및 주의점
- 메모리를 무한히 늘리는 것은 피하세요. 문제의 근본 원인이 메모리 누수나 비효율적 코드라면 단기적으로만 해결됩니다.
- 공유호스팅에서는 제공되는 상한이 있으므로 호스트 정책을 확인해야 합니다.
- PHP의 다른 설정(예: max_execution_time, upload_max_filesize)도 영향을 줄 수 있으니 종합적으로 검토하세요.
언제 이 방법들이 실패하는가 (예시)
- PHP 프로세스 외부(운영체제 수준)에서 메모리 제한이 걸려 있는 경우
- 호스트가 .htaccess 또는 ini_set()을 차단한 경우
- 스크립트 자체에 심각한 메모리 누수 또는 무한루프가 있는 경우
- 컨테이너 환경에서 컨테이너 리소스 쿼터가 낮게 설정된 경우
이럴 땐 호스팅 사업자나 인프라 담당자와 협의해 컨테이너/VM의 메모리 할당을 늘리거나 코드를 수정해야 합니다.
추가 자료: 빠른 명령 예시
- Apache 재시작
sudo systemctl restart httpd # CentOS/RedHat 계열
sudo systemctl restart apache2 # Ubuntu/Debian 계열
- PHP-FPM 재시작
sudo systemctl restart php-fpm
# 또는
sudo systemctl restart php7.4-fpm
의사결정 흐름(간단한 플로우차트)
flowchart TD
A[오류 발생: Out of memory] --> B{php.ini 접근 가능한가?}
B -- 예 --> C[php.ini에서 memory_limit 증가]
B -- 아니오 --> D{워드프레스인가?}
D -- 예 --> E[wp-config.php에 WP_MEMORY_LIMIT 추가]
D -- 아니오 --> F[해당 스크립트에 ini_set 추가]
C --> G[재시작 후 재검증]
E --> G
F --> G
G --> H{해결됨?}
H -- 예 --> I[모니터링 계속]
H -- 아니오 --> J[호스트/운영자에 문의 및 프로파일링]
간단한 체크리스트 템플릿
- 문제 식별: 로그 + 에러 메시지 수집
- 우선 조치: Apache/PHP 재시작(임시 완화)
- 영구 조치: php.ini 또는 대체 방법 수정
- 검증: 오류 재현 시도 및 로그 확인
- 개선: 코드를 리팩터링하고 메모리 사용량 테스트
결론
PHP의 “Out of memory” 오류는 대부분 PHP 메모리 제한을 늘리면 해결됩니다. 다만 임시 조치(재시작)로 문제를 가리기보다는 php.ini 수정, 디렉터리/스크립트 단위 설정, 코드 최적화 순으로 접근하세요. 필요 시 호스팅 업체나 인프라 팀과 협력해 근본 원인을 찾아내고 재발을 방지해야 합니다.
요약 아래를 참고하세요.
Image Courtesy: Clarkandransom
요약 및 참고표
- 문제: PHP 스크립트가 허용된 메모리보다 더 많은 메모리를 요구
- 4가지 해결책: php.ini, ini_set(), .htaccess, wp-config.php
- 임시 해결: Apache 재시작
- 권장: 근본 원인 분석(로그, 프로파일링) 후 적절한 메모리 값 설정 및 코드 개선
저자
편집