Đăng ngày: 22-03-2016 · cập nhật lần cuối: 02-04-2016 · bởi skillaug_vn

Cache là gì?


Một ví dụ nhỏ sau đây sẽ giúp bạn hiểu hơn về cơ chế Cache

Giả sử bạn có một bài toán: hãy cho kết quả của phép tính "1+1" và đọc kết quả đó cho 100 người. Ngay bây giờ là người đầu tiên đang chờ kết quả của bài toán từ tôi. đứng trước bài toán như vậy, để có kết quả chính xác thì điều đầu tiên tôi cần làm đó là sử dụng máy tính, tôi mất 4s để bấm máy tính, và nói ngay cho kết quả là 2 cho người đầu tiên sau khi thực hiện tính toán, và bây giờ tôi đã ghi nhớ kết quả của bài toán đó vào đầu. đến người thứ hai, tôi chỉ cần nhớ lại và đọc ngay kết quả cho người đó là 2 mà không cần tính toán, cứ thế đến người thứ ba.... và cho đến người cuối cùng. rất nhanh phải không. Cơ chế hoạt động của Cache nó cũng tương tự như vậy.

Cache - còn được gọi là bộ nhớ đệm, chứa dữ liệu của các phép tính trước đó, nằm chờ để được sử dụng trong tương lai.

Cache PHP

Để có thể tạo Cache cho trang web bằng PHP một cách hiệu quả, các bạn cần phải hiểu được cách mà nó hoạt động, tránh rập khuôn vào code của mình mà không hiểu gì nhé, dưới đây là 2 cách tạo cache bằng PHP để các bạn tham khảo.

1. Cache cho các Query vào Database

Các câu lệnh Query đến CSDL khiến máy chủ rất mất thời gian để xử lý, nhất là các câu Query có nhiều dữ liệu. nên ta cần giải pháp thay thế, nhẹ nhàng hơn đó là tạo Cache cho các Câu truy vấn dữ liệu và lưu vào thư mục nào đó, sau đó ta chỉ cần kiểm tra đã tồn tại file cache cho câu lệnh Query đến CSDL hay chưa, nếu true thì ta sử dụng dữ liệu Cache, còn false thì ta tiến hành tạo Cache mới cho câu lệnh Query đến CSDL đó.
<?php
$cfile = 'cached/sql/sql_cache_file_example.xml'; // Đường dẫn lưu cache
// Nếu tồn tại cache file
if (file_exists($cfile))
{
    // Uunserialize data từ cache file
    $records = unserialize(file_get_contents($cfile)); 
}
else // Nếu không thì cập nhật lại cache file
{
    //Kết nối CSDL
    $conn = mysqli_connect('localhost','username','password','db_name') or die (mysqli_error_list());
    //Truy vấn CSDL
    $query = "SELECT * FROM db_table"; 
    $result = mysqli_query($conn, $query);
    while ($record = mysqli_fetch_array($result))
    {
        $records[] = $record; 
    }
    // Serialize data và push vào cache file
    $fp = fopen($cfile,"w");
    fputs($fp, serialize($records));
    fclose($fp);
}
?>

2. Cache cho các đoạn mã PHP

Thực ra mà nói thì PHP xử lý khá nhanh rồi nhưng nếu có thể tạo cache thì sẽ tăng tốc độ xử lý lên đáng kể đấy.
<?php
$cfile = 'cached/name_file_cache';
if(file_exists($cfile))
{
    $content = file_get_contents($cfile);
    echo $content;
}
else
{
    ob_start();
    // Tại đây, các đoạn mã PHP kể cả Query vào Database sẽ được buffer
    for($i = 1; $i < 30; $i++)
    {
        echo 'I love PHP<br/>';
    }
    $content = ob_get_contents(); 
    ob_end_clean(); 
    file_put_contents($cfile,$content);
} 
?>
Trong trường hợp bạn muốn tạo Cache cho URL động thì đường dẫn Cache cũng cần phải động. ví dụ bạn cần tạo cache cho url: /category.php?p=1 thì url của cache sẽ là: category-id1 chẳng hạn.

Làm mới Cache

Đây là điều quan trọng nhất bạn cần chú ý để có thể hiển thị đúng dữ liệu cho người dùng, vậy khi nào thì ta cần làm mới Cache?

- Đối với dữ liệu thời gian thực như: số lượt xem, số lượt mua... thì bạn cần đặt thời gian để làm mới cache, ví dụ đặt thời gian là 30 phút $timeout = 1800; (thời gian tính bằng giây) và thêm điều kiện filemtime($cfile) > (time() - $timeout).

- Đối với dữ liệu tĩnh hoàn toàn thì nó chỉ sẽ thay đổi trong trường hợp ta sửa nó, cho nên ta chỉ cần xóa file Cache khi ta phát lệnh sửa là được, sử dụng: @unlink('dir/name_file_cache'); để xóa
1