워드프레스 "Allowed Memory Size Exhausted" 오류 해결하기
사이트에 Fatal error: Allowed memory size of 268435456 bytes exhausted 오류가 뜬다면, wp-config.php 파일의 / That's all, stop editing! / 위에 이 줄을 추가하세요.
게시됨
사이트에 Fatal error: Allowed memory size of 268435456 bytes exhausted 오류가 뜬다면, wp-config.php 파일의 /* That's all, stop editing! */ 주석 위에 이 줄을 추가하세요: define( 'WP_MEMORY_LIMIT', '256M' );. 대부분의 사이트는 이걸로 1분도 안 돼서 다시 살아납니다. 하지만 그냥 넘어가지 말고 이 페이지를 끝까지 읽어보세요. 한도를 올리는 건 치료가 아니라 진단일 뿐이니까요. 더 높은 숫자에서 다시 오류가 난다면, 진짜 문제는 메모리를 끝없이 잡아먹는 코드이고, 한도를 더 올리는 건 그 코드에 밧줄을 더 풀어주는 셈일 뿐입니다.
이 오류가 실제로 의미하는 것
PHP는 각 요청이 메모리를 얼마나 할당했는지 추적합니다. 하나의 요청이 php.ini에 설정된(혹은 워드프레스가 재정의한) memory_limit를 넘어서 할당하려고 하면, PHP는 그 요청을 즉시 종료하고 치명적 오류를 내면서 죽은 지점의 바이트 수를 출력합니다. 268435456 bytes는 256M입니다. 134217728은 128M이고요. 536870912는 512M입니다. “tried to allocate” 뒤에 나오는 숫자는 마지막 지푸라기의 크기이지, 문제의 크기가 아닙니다.
워드프레스는 PHP 위에 자체 한도를 얹습니다. WP_MEMORY_LIMIT(기본값 40M, PHP 한도가 더 높으면 그 값)는 프런트엔드를 관장합니다. WP_MAX_MEMORY_LIMIT(기본값 256M)는 미디어 라이브러리나 플러그인 업데이트처럼 실제로 더 많은 메모리가 필요한 관리자 측 작업을 관장합니다. 워드프레스는 이 상수들을 기준으로 로드 시점에 ini_set('memory_limit', ...)를 호출합니다. 단, 호스트가 ini_set을 허용하는 경우에 한해서, 그리고 호스트가 설정한 상한선까지만요. 이 마지막 부분이 바로 wp-config.php를 수정해도 아무 일도 안 일어나는 것처럼 보일 때가 있는 이유입니다.
순서대로 해결하기
1. wp-config.php에서 워드프레스 한도를 올립니다. 되돌릴 수 있고 다른 것은 전혀 건드리지 않으니 가장 먼저 시도해볼 방법입니다.
define( 'WP_MEMORY_LIMIT', '256M' );
define( 'WP_MAX_MEMORY_LIMIT', '512M' );
이 줄들을 어디에 넣어야 할지 모르겠거나, 다른 흔한 상수들도 동시에 제대로 설정하고 싶다면, 저희 wp-config 생성기가 그대로 붙여넣을 수 있는 깔끔한 블록을 만들어 줍니다. 위치가 중요합니다 — “stop editing” 줄 아래에 있는 건 전부 무시됩니다.
2. 그래도 아무 변화가 없다면, 호스트가 PHP 단에서 막고 있는 겁니다. PHP 단에서 memory_limit를 올리세요. php.ini에서:
memory_limit = 256M
공유 호스팅에서는 php.ini를 직접 수정할 수 없는 경우가 많습니다. 대신 웹 루트에 .user.ini 파일을 만들어 보거나, Apache/mod_php 환경이라면 .htaccess로 설정하세요:
php_value memory_limit 256M
.htaccess의 php_value는 Apache/mod_php 지시어이기 때문에 nginx나 PHP-FPM 환경에서는 500 오류를 냅니다. 이걸 추가한 뒤 500 오류가 났다면 그게 이유입니다 — 제거하고 .user.ini를 사용하세요.
3. 실제로 적용된 값을 확인합니다. 자신이 수정한 값을 믿지 말고, PHP가 보고하는 값을 믿으세요. 웹 루트에 한 줄짜리 파일을 하나 놓습니다:
<?php echo ini_get('memory_limit');
브라우저에서 이 파일을 열어 값을 확인한 뒤, 파일을 삭제하세요. 256M로 설정했는데도 여전히 128M라고 나온다면, 호스트가 여러분의 설정을 덮어쓰고 있는 것이므로 호스트에 문의하거나 호스트의 제어판 설정을 사용해야 합니다.
대부분의 가이드가 건너뛰는 부분
한도를 올리는 건 진단입니다. 그 결과를 해석하는 방법은 다음과 같습니다.
256M로 설정했더니 평상시 트래픽에서 사이트가 멀쩡하다면, 원래 한도가 너무 낮았던 정당한 경우입니다 — 큰 미디어 라이브러리, 우커머스, 페이지 빌더를 쓰는 사이트에서 흔하죠. 여기서 끝입니다.
256M로 설정했는데 또 죽고, 512M로 올렸는데 또 죽는다면, 더 이상 올리지 마세요. 정상적인 워드프레스 요청은 512M가 필요하지 않습니다. 메모리 사용량이 한계 없이 계속 올라간다면, 뭔가가 무한 반복되거나 계속 쌓이고 있는 겁니다: 데이터베이스 테이블 전체를 배열로 불러오는 플러그인, 자기 자신을 재귀적으로 호출하는 add_action, 모든 행을 한꺼번에 메모리에 붙들고 있는 가져오기 루틴, 혹은 같은 훅 안에서 서로 충돌하는 두 플러그인 등이요. 한도를 올린다고 해서 무한 루프가 고쳐지지는 않습니다 — 그저 오류가 나는 시점을 몇 초 뒤로 미루고, 재현하기만 더 어렵게 만들 뿐입니다.
원인을 찾으려면, 모든 플러그인을 비활성화하고 Twenty Twenty-Four 같은 기본 테마로 전환하세요. 오류가 멈추면, 다시 나타날 때까지 하나씩 재활성화합니다. 어디서 죽는지 잡아내려면 디버그 로그를 켜세요:
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );
wp-content/debug.log의 치명적 오류 줄에는 마지막 청크를 할당한 파일과 줄 번호가 나옵니다. 그게 보통 문제의 루프이거나, 그 루프에서 함수 호출 한 단계 떨어진 곳입니다.
하지 말아야 할 것
WP_MEMORY_LIMIT를 -1이나 1024M로 설정하고 잊어버리지 마세요. 무제한 메모리는 누수를 고쳐주지 않습니다. 폭주하는 요청이 서버 전체를 잡아먹게 놔두는 것이고, 그러면 같은 서버에 있는 다른 모든 사이트까지 다운시켜 호스트에서 전화가 올 수 있습니다. 한도는 안전장치입니다. 하나쯤은 유지하세요.
ini_set('memory_limit', '512M')를 주 해결책으로 functions.php에 붙여넣지 마세요. 일부 오류에는 너무 늦게 실행됩니다 — 테마의 functions.php가 실행되기 전, 워드프레스 코어 로드 중에 오류가 나면 그 줄은 아예 실행되지 않습니다. wp-config.php가 더 먼저 로드되며, 이게 올바른 위치입니다.
호스팅 문제라고 단정하고 요금제를 업그레이드하지 마세요. 정말로 사양이 부족한 호스팅일 때도 있습니다. 하지만 원인이 플러그인에 딸려오기 때문에 더 큰 요금제로 옮겨가도 똑같은 오류가 그대로 따라오는 경우가 많습니다. 루프부터 배제하세요. 그건 공짜니까요.
max_execution_time 오류를 고치려고 memory_limit를 올리지 마세요. 둘은 메시지가 다른, 서로 다른 한도입니다. 메모리 고갈은 “Allowed memory size … exhausted”라고 하고, 타임아웃은 “Maximum execution time … exceeded”라고 합니다. 엉뚱한 걸 올리면 오후 한나절을 낭비합니다.
그래도 안 된다면?
실제 적용된 한도가 진짜로 256M 이상인 걸 확인했고, 모든 플러그인을 끄고 기본 테마로 테스트했는데도 여전히 메모리가 고갈된다면, 이건 올려야 할 한도의 문제가 아니라 디버그 로그에서 추적할 가치가 있는 진짜 누수입니다. 치명적 오류 줄을 캡처하고, 그것이 어느 플러그인의 디렉터리를 가리키는지 기록하세요. 그게 바로 여러분의 버그 리포트입니다. 먼저 wp-config 생성기로 기본 wp-config.php 상수들을 제대로 잡아서 한도가 생각한 대로 설정되어 있는지 확인한 다음, 로그를 읽으러 가세요.