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)
- Backup bảng
wp_options. - Đo dung lượng autoload và xem option nặng nhất.
- Kiểm tra và xoá hoặc cập nhật
_transient_dirsize_cache. - Thêm đoạn PHP để ép
autoload='off'. - 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 và _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