1. Đặt mã tạo cache ở đầu trang
Chèn đoạn mã sau vào đầu mỗi trang PHP (trước bất kỳ dòng HTML nào):
<?php
$cache_ext = '.html'; // Phần mở rộng của file cache
$cache_time = 43200; // Thời gian cache tồn tại (giây)
$cache_folder = 'cache/'; // Thư mục lưu cache
$ignore_pages = ['']; // Những URL không cache
$dynamic_url = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] . $_SERVER['QUERY_STRING'];
$cache_file = $cache_folder . md5($dynamic_url) . $cache_ext;
$ignore = in_array($dynamic_url, $ignore_pages);
if (!$ignore && file_exists($cache_file) && (time() - filemtime($cache_file)) < $cache_time) {
ob_start('ob_gzhandler'); // Nén gzip nếu có thể
readfile($cache_file);
echo '<!-- Cached page - ' . date('Y-m-d H:i:s', filemtime($cache_file)) . ' -->';
ob_end_flush();
exit;
}
ob_start('ob_gzhandler');
?>
Giải thích:
- Cache theo URL: mỗi trang được lưu với tên file hash riêng biệt
- Không cache trang trong mảng
$ignore_pages - Nén gzip nếu trình duyệt hỗ trợ
2. Đặt mã lưu nội dung vào cuối trang
Ngay trước thẻ </html> hoặc cuối file PHP, thêm đoạn sau để ghi nội dung vào cache:
<?php
if (!is_dir($cache_folder)) {
mkdir($cache_folder, 0755, true);
}
if (!$ignore) {
$fp = fopen($cache_file, 'w');
fwrite($fp, ob_get_contents());
fclose($fp);
}
ob_end_flush();
?>
3. Tùy chỉnh cache
- Thời gian cache: chỉnh
$cache_time(tính bằng giây) - Xóa cache: vào thư mục
cache/và xóa file tương ứng - Không cache những URL động (ví dụ admin, trang đăng nhập…): thêm vào mảng
$ignore_pages
4. Gợi ý cải tiến
- Thêm điều kiện chỉ tạo cache khi HTTP Method là
GET - Thêm chức năng tự xóa cache cũ định kỳ bằng cron hoặc khi đăng bài mới
- Thêm subfolder theo ngày để quản lý cache gọn hơn
Kết luận
Đây là một kỹ thuật nhỏ nhưng hiệu quả, từng là “ông tổ của cache thủ công” trong thời kỳ PHP + MySQL thuần chưa có framework. Dù ngày nay có nhiều giải pháp cao cấp hơn như object cache, page cache bằng Redis, plugin chuyên dụng…, nhưng đôi khi chính những cách làm cơ bản thế này lại giúp bạn hiểu rõ cơ chế hoạt động phía sau một cách sâu sắc hơn.
Bình luận