Bỏ qua tới nội dung
Cấu hình

Khắc phục lỗi "Allowed Memory Size Exhausted" trong WordPress

Nếu site của bạn báo Fatal error: Allowed memory size of 268435456 bytes exhausted, hãy thêm dòng này vào wp-config.php phía trên dòng / That's all, stop editing! /

Đã đăng

Nếu site của bạn báo Fatal error: Allowed memory size of 268435456 bytes exhausted, hãy thêm dòng này vào wp-config.php phía trên dòng comment /* That's all, stop editing! */: define( 'WP_MEMORY_LIMIT', '256M' );. Cách này đưa hầu hết các site trở lại hoạt động trong chưa đầy một phút. Nhưng hãy đọc hết trang này trước khi bạn rời đi, vì nâng giới hạn chỉ là chẩn đoán, chứ không phải cách chữa. Nếu lỗi lại xuất hiện ở một con số cao hơn, vấn đề thật sự nằm ở đoạn code đang ngốn bộ nhớ vô tội vạ, và trần bộ nhớ lớn hơn chỉ cho nó thêm dây thừng để tự treo cổ thôi.

Lỗi này thực chất nghĩa là gì

PHP theo dõi lượng bộ nhớ mà mỗi request đã cấp phát. Khi một request cố cấp phát vượt quá memory_limit được đặt trong php.ini (hoặc bị WordPress ghi đè), PHP kết thúc request đó ngay lập tức bằng một fatal error và in ra số byte tại thời điểm nó chết. 268435456 bytes là 256M. 134217728 là 128M. 536870912 là 512M. Con số đứng sau “tried to allocate” cho bạn biết kích thước của giọt nước tràn ly cuối cùng, chứ không phải kích thước của vấn đề.

WordPress chồng thêm các giới hạn riêng lên trên PHP. WP_MEMORY_LIMIT (mặc định 40M, hoặc bằng giới hạn PHP nếu cao hơn) chi phối phần front end. WP_MAX_MEMORY_LIMIT (mặc định 256M) chi phối các thao tác phía admin như thư viện media và cập nhật plugin, vốn thực sự cần nhiều hơn. WordPress gọi ini_set('memory_limit', ...) khi tải trang dựa trên các hằng số này — nhưng chỉ khi hosting của bạn cho phép ini_set, và chỉ tối đa đến mức trần cứng mà hosting đặt. Chính phần cuối này là lý do vì sao đôi khi sửa wp-config.php mà chẳng thấy tác dụng gì.

Fix theo thứ tự

1. Nâng giới hạn WordPress trong wp-config.php. Đây là thứ nên thử đầu tiên vì nó có thể hoàn tác và không đụng đến thứ gì khác.

define( 'WP_MEMORY_LIMIT', '256M' );
define( 'WP_MAX_MEMORY_LIMIT', '512M' );

Nếu bạn không chắc mấy dòng này đặt ở đâu, hoặc muốn cùng lúc đặt đúng các hằng số phổ biến khác, công cụ tạo wp-config của chúng tôi sẽ tạo ra một khối code gọn gàng để bạn dán vào. Vị trí rất quan trọng — bất cứ thứ gì nằm dưới dòng “stop editing” đều bị bỏ qua.

2. Nếu không có tác dụng gì, tức là hosting của bạn đang giới hạn PHP. Hãy nâng memory_limit ở cấp PHP. Trong php.ini:

memory_limit = 256M

Trên nhiều hosting chia sẻ bạn không thể sửa trực tiếp php.ini. Hãy thử một file .user.ini trong thư mục gốc web, hoặc đặt qua .htaccess trên môi trường Apache/mod_php:

php_value memory_limit 256M

Lưu ý rằng php_value trong .htaccess sẽ gây ra lỗi 500 trên nginx hoặc trên môi trường PHP-FPM, vì đây là một directive của Apache/mod_php. Nếu bạn gặp lỗi 500 sau khi thêm dòng đó, thì đó là lý do — hãy gỡ nó ra và dùng .user.ini.

3. Xác nhận giá trị đang thực sự có hiệu lực. Đừng tin vào những gì bạn đã sửa; hãy tin vào những gì PHP báo cáo. Đặt một file một dòng ở thư mục gốc web:

<?php echo ini_get('memory_limit');

Mở nó trên trình duyệt, đọc giá trị, rồi xóa file đi. Nếu nó vẫn báo 128M sau khi bạn đã đặt 256M, tức là hosting đang ghi đè giá trị của bạn và bạn cần liên hệ với họ hoặc dùng thiết lập trong control panel của họ.

Phần mà hầu hết hướng dẫn đều bỏ qua

Nâng giới hạn là để chẩn đoán. Đây là cách đọc kết quả.

Nếu bạn đặt 256M và site vẫn chạy ổn dưới lưu lượng bình thường, tức là bạn vốn có một cái trần hợp lý nhưng đặt quá thấp — thường gặp ở các site có thư viện media lớn, WooCommerce, hoặc page builder. Vậy là xong.

Nếu bạn đặt 256M rồi lại sập, rồi 512M rồi lại sập, hãy ngừng nâng. Một request WordPress bình thường không cần đến 512M. Khi lượng bộ nhớ tăng mãi không có trần, tức là có thứ gì đó đang lặp hoặc tích tụ: một plugin nạp cả một bảng cơ sở dữ liệu vào mảng, một add_action tự kích hoạt chính nó theo kiểu đệ quy, một routine import giữ mọi dòng dữ liệu trong bộ nhớ cùng lúc, hoặc hai plugin xung đột nhau bên trong cùng một hook. Nâng giới hạn không sửa được một vòng lặp không giới hạn — nó chỉ dời cú sập ra muộn hơn vài giây và khiến việc tái hiện lỗi khó hơn.

Để tìm ra thủ phạm, hãy tắt toàn bộ plugin và chuyển sang một theme mặc định như Twenty Twenty-Four. Nếu lỗi biến mất, bật lại từng plugin một cho đến khi lỗi quay lại. Bật debug log để bắt được chỗ nó chết:

define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );

Dòng fatal trong wp-content/debug.log chỉ ra tên file và số dòng đã cấp phát khối cuối cùng. Đó thường chính là vòng lặp, hoặc chỉ cách nó một lần gọi hàm.

Những điều không nên làm

Đừng đặt WP_MEMORY_LIMIT thành -1 hay 1024M rồi quên nó đi. Bộ nhớ không giới hạn không sửa được rò rỉ; nó cho phép một request mất kiểm soát ngốn sạch cả server, có thể làm sập mọi site khác trên cùng một máy và khiến hosting gọi điện cho bạn. Cái trần là một tính năng an toàn. Hãy giữ lấy nó.

Đừng dán ini_set('memory_limit', '512M') vào functions.php như cách fix chính. Nó chạy quá muộn với một số lỗi — nếu cú sập xảy ra trong lúc nạp core của WordPress, trước khi functions.php của theme được thực thi, thì dòng đó không bao giờ chạy. wp-config.php được nạp sớm hơn và là nơi đúng để đặt.

Đừng vội cho rằng đây là vấn đề của hosting rồi nâng cấp gói. Đôi khi đúng là hosting thực sự thiếu tài nguyên. Nhưng thường thì đúng y cú sập đó vẫn đi theo bạn sang gói lớn hơn, vì nguyên nhân đã được đóng gói sẵn trong đám plugin của bạn. Hãy loại trừ vòng lặp trước; việc đó miễn phí.

Đừng nâng memory_limit để sửa lỗi max_execution_time. Chúng là hai giới hạn khác nhau với thông báo khác nhau. Cạn bộ nhớ báo “Allowed memory size … exhausted.” Hết thời gian báo “Maximum execution time … exceeded.” Nâng nhầm cái sẽ khiến bạn mất toi cả buổi chiều.

Vẫn bí?

Nếu bạn đã xác nhận giới hạn đang chạy đúng là 256M trở lên, đã thử với toàn bộ plugin tắt và một theme mặc định, mà nó vẫn cạn bộ nhớ, thì bạn có một chỗ rò rỉ thực sự đáng truy trong debug log, chứ không phải một cái trần đáng nâng. Hãy ghi lại dòng fatal, để ý xem nó trỏ vào thư mục của plugin nào, và đó chính là báo cáo lỗi của bạn. Trước tiên hãy đặt cho đúng các hằng số nền tảng trong wp-config.php bằng công cụ tạo wp-config để bạn chắc chắn các giới hạn được đặt đúng chỗ bạn nghĩ — rồi hẵng đi đọc log.