Triệu chứng
Bạn nhấn "Gửi" (Submit) khi tải lên một tệp lớn, nhưng trang tải lại mà không có dữ liệu, hoặc ứng dụng của bạn hoạt động như thể biểu mẫu bị trống. Nếu bạn kiểm tra nhật ký máy chủ (server logs), bạn sẽ thấy cảnh báo cụ thể này:
Warning: POST Content-Length exceeds the limit. upload_max_filesize directive in php.ini in Unknown on line 0
Lỗi này đặc biệt gây bối rối vì PHP không chỉ chặn tệp; nó thường xóa toàn bộ các mảng $_POST và $_FILES. Script của bạn hoàn toàn không nhận được gì để xử lý.
Tại sao điều này xảy ra
Các giá trị mặc định của PHP thường khá hạn chế. Theo mặc định, upload_max_filesize thường được đặt là 2MB và post_max_size là 8MB. Các giới hạn này tồn tại để bảo vệ tài nguyên máy chủ của bạn không bị quá tải bởi các tệp tải lên lớn bất ngờ.
Cảnh báo được kích hoạt khi tổng kích thước dữ liệu của bạn (Content-Length) lớn hơn giá trị được xác định trong post_max_size. Ngay cả khi bạn chỉ tải lên một tệp, toàn bộ yêu cầu—bao gồm các trường văn bản và metadata của biểu mẫu—phải nằm trong các giới hạn này.
Sửa lỗi từng bước
1. Tìm tệp php.ini của bạn
Việc tìm đúng tệp cấu hình là trở ngại đầu tiên. Vì nhiều hệ thống cài đặt nhiều phiên bản PHP, CLI có thể sử dụng một tệp php.ini khác với máy chủ web của bạn. Cách nhanh nhất để tìm đường dẫn của máy chủ web là tạo một tệp info.php tạm thời trong thư mục gốc của trang web:
<?php phpinfo(); ?>
Truy cập tệp này trong trình duyệt của bạn và tìm kiếm Loaded Configuration File. Các đường dẫn phổ biến bao gồm /etc/php/8.2/fpm/php.ini hoặc /etc/php.ini.
2. Cập nhật cấu hình
Mở tệp đó bằng một trình soạn thảo như nano hoặc vim. Tìm kiếm và tăng ba giá trị này lên mức phù hợp với nhu cầu của bạn—ví dụ: để cho phép tải lên 100MB:
; Ví dụ: Đặt giới hạn thành 100 Megabytes
upload_max_filesize = 100M
post_max_size = 110M
memory_limit = 256M
Một yêu cầu quan trọng: Luôn đảm bảo post_max_size lớn hơn một chút so với upload_max_filesize để tính đến dữ liệu dư thừa của biểu mẫu. Ngoài ra, memory_limit của bạn phải lớn hơn post_max_size để yêu cầu được xử lý chính xác.
3. Khởi động lại máy chủ Web hoặc Dịch vụ PHP
PHP không tự động tải lại cấu hình. Bạn phải khởi động lại dịch vụ xử lý các yêu cầu PHP của mình một cách thủ công.
Đối với Apache trên Ubuntu/Debian:
sudo systemctl restart apache2
Đối với Nginx với PHP-FPM (điều chỉnh phiên bản nếu cần):
sudo systemctl restart php8.2-fpm
Nếu bạn đang sử dụng XAMPP hoặc WAMP trên Windows, chỉ cần sử dụng bảng điều khiển (control panel) để dừng và bắt đầu các dịch vụ.
Cách thay thế: Sửa qua .htaccess (Chỉ dành cho Apache)
Trên hosting chia sẻ (shared hosting), nơi bạn không thể chạm vào php.ini, bạn thường có thể ghi đè các cài đặt này bằng tệp .htaccess trong thư mục gốc của dự án:
php_value upload_max_filesize 100M
php_value post_max_size 110M
php_value memory_limit 256M
Lưu ý: Cách này chỉ hoạt động nếu máy chủ của bạn đã bật AllowOverride Options cho thư mục của bạn.
Cách thay thế: Sửa qua .user.ini (CGI/FastCGI)
Đối với hosting chia sẻ hiện đại chạy PHP dưới dạng FastCGI, bạn có thể tạo tệp .user.ini trong thư mục gốc. Nó đơn giản hơn so với .htaccess:
upload_max_filesize = 100M
post_max_size = 110M
Mẹo quan trọng cho người dùng Nginx
Ngay cả khi bạn đã sửa cấu hình PHP, Nginx vẫn có giới hạn tải lên nội bộ riêng gọi là client_max_body_size. Nếu tệp của bạn vẫn thất bại với lỗi "413 Request Entity Too Large", bạn cần cập nhật cấu hình Nginx (thường trong /etc/nginx/nginx.conf hoặc cấu hình cụ thể cho trang web của bạn):
http {
...
client_max_body_size 100M;
}
Sau khi thay đổi cấu hình Nginx, hãy chạy nginx -t để kiểm tra lỗi cú pháp và tải lại bằng systemctl reload nginx.

