Kiểm tra và khắc phục lỗi autoload phình to do _transient_dirsize_cache trong WordPress

Trong một số trường hợp, WordPress hoặc plugin thứ ba có thể lưu transient _transient_dirsize_cache với autoload='on' hoặc autoload='auto'. Điều này khiến dữ liệu cache (đôi khi lên đến hàng trăm KB) bị nạp vào bộ nhớ trên mọi lần tải trang, làm tăng RAM tiêu thụ và khiến website chậm đi rõ rệt. Bài viết này hướng dẫn cách kiểm tra autoload, xác định khóa gây nặng database, và khắc phục an toàn bằng SQL, PHP hoặc WP-CLI.

Kiểm tra và khắc phục lỗi autoload phình to do _transient_dirsize_cache trong WordPress

Vì sao _transient_dirsize_cache có thể làm chậm website?

Khóa _transient_dirsize_cache lưu cache kích thước thư mục để WordPress tính toán nhanh hơn khi kiểm tra dung lượng ổ đĩa cho việc cập nhật, upload, hoặc cron. Nếu plugin hoặc code tùy chỉnh lưu transient này với chế độ autoload bật, hàng trăm KB dữ liệu có thể bị tải vào bộ nhớ trên mỗi lần load trang, làm giảm hiệu năng website.

Kiểm tra dung lượng Autoload (on/auto/off)

Đo tổng dung lượng autoload và xác định các option nặng nhất. (Hệ thống này sử dụng autoload = ‘on’ | ‘auto’ | ‘off’.)

-- Tổng dung lượng autoload (KB)
SELECT ROUND(SUM(OCTET_LENGTH(option_value)) / 1024, 2) AS autoload_kb
FROM wp_options
WHERE autoload IN ('on','auto');

-- Liệt kê top 20 option autoload nặng nhất
SELECT option_name,
       ROUND(OCTET_LENGTH(option_value) / 1024, 2) AS size_kb
FROM wp_options
WHERE autoload IN ('on','auto')
ORDER BY OCTET_LENGTH(option_value) DESC
LIMIT 20;

Phát hiện _transient_dirsize_cache

Kiểm tra kích thước và trạng thái autoload trực tiếp:

SELECT option_name, autoload,
       ROUND(OCTET_LENGTH(option_value) / 1024, 2) AS size_kb
FROM wp_options
WHERE option_name IN ('_transient_dirsize_cache', '_transient_timeout_dirsize_cache');

Khắc phục Autoload bị phình bằng SQL

Giữ dữ liệu nhưng tắt autoload ngay lập tức:

UPDATE wp_options
SET autoload = 'off'
WHERE option_name IN ('_transient_dirsize_cache', '_transient_timeout_dirsize_cache');

Hoặc xóa để WordPress tự tạo lại cache đúng cách:

DELETE FROM wp_options
WHERE option_name IN ('_transient_dirsize_cache', '_transient_timeout_dirsize_cache');

Ngăn tái phát bằng PHP

Ép các transient này luôn luôn ở trạng thái không autoload:

<?php
/**
 * Ép autoload='off' cho các transient dirsize_cache (on/auto/off setup).
 */
add_action('added_option', function ($option, $value) {
    static $targets = ['_transient_dirsize_cache', '_transient_timeout_dirsize_cache'];
    if (in_array($option, $targets, true)) {
        global $wpdb;
        $wpdb->update($wpdb->options, ['autoload' => 'off'], ['option_name' => $option]);
    }
}, 10, 2);

add_action('updated_option', function ($option, $old_value, $value) {
    static $targets = ['_transient_dirsize_cache', '_transient_timeout_dirsize_cache'];
    if (in_array($option, $targets, true)) {
        global $wpdb;
        $wpdb->update($wpdb->options, ['autoload' => 'off'], ['option_name' => $option]);
    }
}, 10, 3);

// Tuỳ chọn: reset transient thủ công qua URL admin
add_action('admin_init', function () {
    if (isset($_GET['reset_dirsize_cache']) && current_user_can('manage_options')) {
        delete_transient('dirsize_cache');
        add_action('admin_notices', function () {
            echo '<div class="notice notice-success"><p>Transient dirsize_cache đã được xoá.</p></div>';
        });
    }
});

WP-CLI (khắc phục nhanh)

# Tổng dung lượng autoload (on/auto)
wp db query "SELECT ROUND(SUM(OCTET_LENGTH(option_value))/1024, 2) AS autoload_kb FROM wp_options WHERE autoload IN ('on','auto');" --skip-column-names

# Kiểm tra transient dirsize_cache
wp db query "SELECT option_name, autoload, ROUND(OCTET_LENGTH(option_value))/1024 AS size_kb FROM wp_options WHERE option_name IN ('_transient_dirsize_cache','_transient_timeout_dirsize_cache');"

# Xoá transient để WordPress tự tạo lại
wp transient delete dirsize_cache

# Ép autoload='off' nếu cần
wp db query "UPDATE wp_options SET autoload='off' WHERE option_name IN ('_transient_dirsize_cache','_transient_timeout_dirsize_cache');"

Quy trình xử lý nhanh (production)

  1. Backup bảng wp_options.
  2. Đo dung lượng autoload và xem option nặng nhất.
  3. Kiểm tra và xoá hoặc cập nhật _transient_dirsize_cache.
  4. Thêm đoạn PHP để ép autoload='off'.
  5. Kiểm tra lại autoload để xác nhận đã xử lý xong.

Multisite

Với multisite, transient tương tự nằm trong bảng wp_sitemeta với key: _site_transient_dirsize_cache_site_transient_timeout_dirsize_cache. Thực hiện kiểm tra / cập nhật tương tự, chỉ cần đổi tên bảng.

Kết luận

Autoload phình to là một “kẻ giết hiệu năng” thầm lặng. Hãy giữ _transient_dirsize_cache tránh autoload, kiểm tra định kỳ, và ép autoload='off' để đảm bảo website chạy nhanh và ổn định.

Bình luận


  • Không có bình luận.

Init Toolbox

Nhấn Ctrl + \ trên máy tính, hoặc vuốt sang trái ở bất kỳ đâu trên mobile.

Đăng nhập





Đang tải...