Chuyện gì đang xảy ra
Bạn đang tải lên một plugin lớn, nhập catalog WooCommerce 5.000 sản phẩm, chạy bulk action, hoặc chỉ đang thao tác trong trang admin — và PHP tự động dừng tiến trình giữa chừng:
Fatal error: Maximum execution time of 30 seconds exceeded in /var/www/html/wp-includes/class-http.php on line 1
PHP áp đặt giới hạn cứng về thời gian một script có thể chạy. Mặc định là 30 giây — đủ cho một lần tải trang thông thường, nhưng quá ngắn cho việc cài plugin, nhập ảnh, hoặc xuất dữ liệu hàng loạt. Khi WordPress gửi request HTTP nội bộ qua WP_Http mà server từ xa phản hồi chậm, hoặc khi bạn đang xử lý tập dữ liệu lớn, bạn sẽ chạm ngưỡng đó rất nhanh.
Tùy theo quyền truy cập server của bạn, có bốn cách khác nhau để tăng giới hạn này. Hãy bắt đầu với cách phù hợp nhất với môi trường của bạn.
Sửa nhanh — wp-config.php
Có quyền truy cập filesystem? Đây là cách nhanh nhất. Thêm một dòng vào wp-config.php trước comment /* That's all, stop editing! */:
<?php
// Tăng thời gian thực thi lên 300 giây
set_time_limit(300);
/* That's all, stop editing! Happy publishing. */
set_time_limit() reset bộ đếm ngược mỗi lần WordPress khởi động. Không cần restart server — thay đổi có hiệu lực ngay ở request tiếp theo. Safe mode sẽ chặn cách này, nhưng safe mode đã không còn liên quan kể từ PHP 5.4.
Thử lại thao tác đã gây ra lỗi. Nếu hoàn thành suôn sẻ, bạn đã xong.
Sửa vĩnh viễn — php.ini
Cách dùng wp-config.php chỉ ảnh hưởng đến WordPress. Để thay đổi toàn bộ server, hãy chỉnh trực tiếp trong php.ini.
Tìm file config đang được sử dụng:
php --ini | grep 'Loaded Configuration'
Không có quyền truy cập CLI? Tạo một file tạm trong thư mục gốc web:
<?php phpinfo();
Mở file đó trong trình duyệt và tìm kiếm "Loaded Configuration File".
Khi đã có đường dẫn, tìm directive này và cập nhật:
max_execution_time = 300
Sau đó restart PHP handler để áp dụng:
# PHP-FPM:
sudo systemctl restart php8.1-fpm
# Apache với mod_php:
sudo systemctl restart apache2
Sửa qua .htaccess (chỉ dành cho Apache)
Trên shared hosting không có quyền truy cập php.ini, .htaccess đôi khi có thể ghi đè các directive PHP. Thêm dòng này vào đầu file .htaccess của WordPress:
php_value max_execution_time 300
Hầu hết các host dùng cPanel đều cho phép điều này. Nếu site của bạn báo lỗi 500 ngay sau khi lưu, nghĩa là host đã tắt tính năng ghi đè qua php_value — hãy xóa dòng đó và quay lại cách dùng wp-config.php.
Sửa qua Nginx + PHP-FPM
Đang dùng Nginx? Bỏ qua .htaccess — nó không có tác dụng ở đây. Cần thiết lập giới hạn ở hai chỗ: file config của FPM pool và server block của Nginx.
File config FPM pool (thường là /etc/php/8.1/fpm/pool.d/www.conf):
request_terminate_timeout = 300
Server block Nginx:
fastcgi_read_timeout 300;
Áp dụng cả hai thay đổi cùng lúc:
sudo systemctl restart php8.1-fpm
sudo systemctl reload nginx
Shared hosting — cPanel / hosting panel
Nhiều shared host cho phép chỉnh cài đặt PHP trực tiếp trong control panel. Trong cPanel, vào Software → Select PHP Version → Options và tìm max_execution_time. Đặt thành 120 hoặc 300 rồi lưu — không cần restart.
Không tìm thấy cài đặt, hoặc thay đổi không được lưu? Host của bạn có thể đang áp đặt giới hạn cứng (thường là 60–120 giây). Hãy mở ticket hỗ trợ — họ đôi khi có thể tăng giới hạn theo yêu cầu.
Lệnh WP-CLI một dòng để kiểm tra
Cần chạy một lệnh WP-CLI cụ thể nhưng cứ bị timeout? Ghi đè giới hạn trực tiếp trong lệnh mà không cần chỉnh bất kỳ file config nào:
WP_CLI_PHP_ARGS='-d max_execution_time=300' wp import content.xml --authors=create
Kiểm tra xem đã sửa thành công chưa
Trước khi thử lại thao tác thực, hãy xác nhận PHP đã nhận được giá trị mới. Lưu đoạn code này thành file check-timeout.php trong thư mục gốc web:
<?php
echo ini_get('max_execution_time');
Truy cập file đó trong trình duyệt. Nó sẽ hiển thị 300 (hoặc giá trị bạn đã đặt). Xóa file ngay sau khi kiểm tra xong — đừng để script chẩn đoán tồn tại trên môi trường production.
Sau đó thử lại thao tác ban đầu — cài plugin, nhập nội dung, cập nhật hàng loạt — và xác nhận nó hoàn thành thành công.
Khi lỗi vẫn tiếp tục xuất hiện
Vẫn bị timeout sau khi đã tăng giới hạn? Vấn đề nằm ở bản thân script. Một số nguyên nhân phổ biến:
- Request HTTP bên ngoài bị treo — WordPress đang gọi đến một API từ xa không phản hồi. Stack trace trỏ đến
class-http.phplà dấu hiệu rõ ràng. Kiểm tra khả năng kết nối từ server của bạn:curl -I https://api.example.com - Query database chậm — Bật
SAVEQUERIEStrongwp-config.phpvà ghi log các query mất hơn 1 giây. Các site WooCommerce với hơn 10.000 sản phẩm thường là thủ phạm hay gặp. - Import không chia batch — WooCommerce và WP All Import đều hỗ trợ cấu hình kích thước batch. Giảm xuống còn 20–50 item mỗi batch thay vì cố xử lý 500 item cùng lúc.
- WP-Cron bị chồng chất — Nếu
wp-cron.phpđang tích lũy request, hãy tắt nó và dùng server cron thực sự. Thêmdefine('DISABLE_WP_CRON', true);vàowp-config.php, rồi lên lịch:*/15 * * * * curl https://yoursite.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1
Nên đặt giá trị bao nhiêu?
300 giây là đủ cho phần lớn các tác vụ WordPress. Nếu một tác vụ thông thường cần hơn 5 phút, đó là vấn đề thiết kế — không phải vấn đề timeout. Hãy xem xét việc chia batch, xử lý nền qua Action Scheduler, hoặc đẩy công việc vào hàng đợi, thay vì cứ tiếp tục tăng giới hạn timeout mãi.

