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.
FAQ
Câu hỏi
Làm sao sửa lỗi “Allowed memory size exhausted” trong WordPress?
Thêm define( 'WP_MEMORY_LIMIT', '256M' ); vào wp-config.php, đặt phía trên dòng /* That's all, stop editing! */, vì mọi thứ nằm dưới dòng đó đều bị bỏ qua. Cách này đưa phần lớn site trở lại trong chưa đầy một phút, nhưng hãy coi giới hạn cao hơn là công cụ chẩn đoán chứ không phải cách chữa lâu dài.
268435456 byte trong thông báo lỗi bộ nhớ PHP là bao nhiêu MB?
268435456 byte là 256M. Để tham chiếu, 134217728 là 128M và 536870912 là 512M. Con số PHP in ra là kích thước của lần cấp phát cuối cùng bị thất bại, không phải quy mô của vấn đề bên dưới, nên nó cho bạn biết trần bạn vừa chạm chứ không cho biết nguyên nhân.
Vì sao sửa wp-config.php không đổi được giới hạn bộ nhớ PHP của tôi?
Nhà cung cấp hosting đang chặn trần PHP. WordPress đặt giới hạn bằng cách gọi ini_set khi tải, việc này chỉ có tác dụng nếu host cho phép ini_set và chỉ tới mức trần cứng của host. Hãy xác nhận giá trị thực bằng một file một dòng ở thư mục gốc web in ra ini_get('memory_limit'), rồi xóa nó đi.
Vì sao php_value memory_limit trong .htaccess gây lỗi 500?
php_value là chỉ thị của Apache/mod_php, nên nó ném lỗi 500 trên các thiết lập nginx hoặc PHP-FPM. Hãy xóa dòng đó và dùng file .user.ini ở thư mục gốc web thay thế, hoặc đặt memory_limit trong php.ini nếu host cho phép bạn sửa file đó.
Đặt giới hạn bộ nhớ WordPress thành không giới hạn có an toàn không?
Không. 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ả máy chủ và có thể kéo sập mọi site khác trên cùng máy. Cái trần chính là một tính năng an toàn. Nếu 512M vẫn sập, hãy ngừng nâng con số và đi tìm vòng lặp gây lỗi.