Như các bạn đã biết, cache là phương pháp giúp làm tăng tốc độ truy cập cũng như giảm bớt gánh nặng xử lý cho server, quá trình cache được thực hiện ở client (trình duyệt) lẫn server. Về phía trình duyệt, các bạn tham khảo bài Http Caching. Hôm nay mình sẽ làm code php tạo cache cho trang web, rất đơn giản thôi nhưng hi vọng giúp bạn hiểu được phần nào.
Ý tưởng: tạo ra file html tĩnh sau khi xử lý xong, và ở lần truy xuất sau, sẽ kiểm tra và load lại file cache. Như vậy sẽ giảm tải gánh nặng cho server. Mình tạo ra file index.php chứa nội dung sau:
// thời gian lưu cache tính theo giây, 7200s = 2h $cachetime = 200; //File cache $cachefile = 'cache/index.html'; /*----Nếu file đã được cache----*/ // Xuất file cache ra, với 2 điều kiện: có cache và chưa vượt quá cachetime if (file_exists($cachefile) && time() - $cachetime < filemtime($cachefile)) { echo "<!-- Cache da tao luc ".date('H:i', filemtime($cachefile))." -->\n"; //file cache sẽ có thêm nội dung này include($cachefile); //Xuất ra nội dung đã cache - file cache exit; //ngừng tại đây, không chạy các lệnh bên dưới. } /*----Nếu file chưa cache----*/ ob_start(); // Bật buffer cho output echo "Hello world! Cache Cache"; // Lưu nội dung sau khi file php chạy xong vào file cache $cached = fopen($cachefile, 'w'); fwrite($cached, ob_get_contents()); fclose($cached); ob_end_flush(); // Dừng buffer, gửi nội dung đến trình duyệt
Block 1. Quy định thời gian và file cache. Ở đây file cache sẽ được lưu trong thư mục cache với tên là index.html (nhớ tạo thư mục này ngang hàng với file chứa nội dung trên nhé). Nếu chưa có hoặc quá hạn sẽ ghi đè lên file cache
// thời gian lưu cache tính theo giây, 7200s = 2h $cachetime = 200; //File cache $cachefile = 'cache/index.html'; /*----Nếu file đã được cache----*/ // Xuất file cache ra, với 2 điều kiện: có cache và chưa vượt quá cachetime if (file_exists($cachefile) && time() - $cachetime < filemtime($cachefile)) { echo "<!-- Cache da tao luc ".date('H:i', filemtime($cachefile))." -->\n"; //file cache sẽ có thêm nội dung này include($cachefile); //Xuất ra nội dung đã cache - file cache exit; //ngừng tại đây, không chạy các lệnh bên dưới. }
Block 2. Nếu file cache chưa được tạo, sẽ tạo mới rồi sau đó hiển thị nội dung ra trình duyệt
/*----Nếu file chưa cache----*/ ob_start(); // Bật buffer cho output echo "Hello world! Cache Cache"; // Lưu nội dung sau khi file php chạy xong vào file cache $cached = fopen($cachefile, 'w'); fwrite($cached, ob_get_contents()); fclose($cached); ob_end_flush(); // Dừng buffer, gửi nội dung đến trình duyệt
2 hàm quan trọng trong code này là ob_start() làm nhiệm vụ bật buffer cho output và ob_get_contents() chứa những gì đã buffer. Đoạn code được cache lại chính là dòng:
echo "Hello world! Cache Cache";
Nếu như đây là một đoạn code dài, truy vấn vào database và rả về một khối html, sau đó được đưa hết vào file cache dạng html thì server sẽ đỡ vất vả biết nhường nào. Như vậy, bạn có thể tùy trường hợp mà cache những khối html hoặc toàn bộ theo mục đích của mình.
Sau khi chạy đoạn code lần đầu tiên, bạn view page source sẽ thấy:
Và sau khi cache được tạo, bạn sẽ thấy:
Kết luận bài viết code php tạo cache cho trang web cơ bản
Đây là một ví dụ rất cơ bản, rất nhỏ về việc cache trên server. Ngoài ra, các bạn có thể thấy, việc xử lý hiển thị cache lúc này cũng do PHP đảm nhiệm, nó sẽ không nhanh bằng .htaccess, nếu bạn có dùng WP Super Cache thì sẽ thấy điều này.
Đơn giản là khi nhận được request, đoạn code .htaccess sẽ chuyển kiểm tra xem file cache có tồn tại hay không, nếu có thì nó sẽ chuyển về file cache, không thì cứ để server xử lý. Đoạn mã kiểm tra:
RewriteCond %{DOCUMENT_ROOT}/wp-content/cache/supercache/%{SERVER_NAME}/$1/index.html -f
Bạn ơi, mình muốn áp dụng nó vào trong wp (nhưng là theme mobile) mong bạn hướng dẫn chi tiết ạ