Đăng nhập Đăng ký website 
Dùng thử miễn phí

Phần 6: Xây dựng cơ chế Cache cho PHP Framework

Cache là gì? và tại sao lại quan trọng đối với website Cache (bộ nhớ đệm) là cơ chế giúp tăng tốc độ xử lý của website khi có yêu cầu từ người sử dụng.

Tốc độ là yếu tố hàng đầu khi truy cập vào website, có nhiều yếu tố tác động đến tốc độ tải website như phần cứng server, mã nguồn sử dụng, lượng thông tin hiển thị trên website, băng thông tại thời điểm kiểm tra và cả trình duyệt của người sử dụng, mỗi yếu tố lại yêu cầu các cơ chế cache khác nhau.

Có rất nhiều kỹ thuật cache khác nhau như File Cache, Memory Cache, Object Cache, Browser Cache, CDN v.v… mỗi kỹ thuật đều có ưu điểm và nhược điểm riêng, tùy thuộc vào nguồn tài nguyên đang có mà bạn có thể chọn hình thức cache phù hợp.
Mô hình cache dữ liệu cho website

Memory Cache là hình thức cache dữ liệu trên Ram của máy tính, tốc độ truy cập nhanh, cơ chế này phụ thuộc nhiều vào phần cứng của server và cần cài đặt thêm System cache hỗ trợ khác như Memcached, Xcache, APC v.v… như vậy nếu có quyền truy cập vào server bạn mới có thể sử dụng, bạn có thể tham khảo phần cài đặt và sử dụng memcache tăng tốc độ cho website để biết cách cài đặt và sử dụng hình thức này.

Khi chúng ta truy cập thì website sẽ phải thực hiện rất nhiều công đoạn như lấy dữ liệu từ Database, tải các tập tin cần sử dụng, sắp xếp thông tin và hiển thị lên trình duyệt, mỗi công đoạn đều cần thời gian để thực hiện.
PHP (Hypertext Preprocessor) là ngôn ngữ thông dịch vì vậy khi có yêu cầu thứ 2 tương tự như vậy, website cũng sẽ thực hiện lại toàn bộ công đoạn như trên, nếu số lượng người truy cập tăng lên server sẽ không đủ tài nguyên để đáp ứng được các yêu cầu này. Cơ chế cache sẽ giúp website giảm được thời gian cũng như quy trình thực hiện các công đoạn trên.
Trong hệ thống DFramework chúng ta sẽ xây dựng cơ chế File Cache, là hình thức lưu trữ nội dung website vào file, khi có yêu cầu chúng ta sẽ kiểm tra và load file này lên.

Chúng ta cùng điểm qua một số ưu và nhược điểm của phương pháp File Cache.
Ưu điểm:
+ Tương thích trên mọi webserver
+ Tốc độ tải website rất nhanh
+ Không cần cài đặt thêm bất kỳ phần mềm nào khác
+ Nếu sử dụng Share Hosting thì chỉ có thể sử dụng phương pháp này
+ Nếu đã sử dụng các phương pháp cache khác vẫn có thể sử dụng thêm phương pháp này để tăng thêm tốc độ
Nhược điểm:
+ Tốn bộ nhớ và dung lượng nếu số lượng file cache nhiều và phải cập nhật file cache thường xuyên
+ Không hiệu quả với các dữ liệu thường xuyên thay đổi hoặc phải sử dụng session/cookie để lưu thông tin

So sánh với các phương pháp cache sử dụng đến Ram
Ưu điểm:
+ Tốc độ truy xuất dữ liệu rất nhanh
Nhược điểm:
+ Chỉ sử dụng được trên server riêng, nơi bạn được phép cấu hình và cài đặt thêm phần mềm khác
+ Chi phí cao vì phải sử dụng nhiều Ram cho phương pháp này

Như vậy phương pháp nào cũng có ưu và nhược điểm riêng, chúng ta có thể kết hợp cả 2 phương pháp để tối ưu hóa tốc độ cache cho website.

Do tự xây dựng cơ chế File Cache riêng nên chúng ta có thể chủ động trong nhiều trường hợp từ đó khắc phục được nhược điểm của cơ chế này. Chúng ta có thể quyết định trang nào sẽ được cache 1 lần duy nhất, chỉ thay đổi khi có cập nhật dữ liệu, trang nào cần phải cache lại theo từng khoảng thời gian quy định và trang nào không sử dụng cache.

Chúng ta sẽ xây dựng lớp DCache để thực hiện các chức năng cần thiết

Trong thư mục dframework/libs/ tạo file dcache.php với nội dung sau:
?php
include(__DIR__.'/ddatabase.php');
class DCache extends DDatabase{
    public $dircache=false;
    public $iscache=false;
    public $timecache=0;
    public function load_file_cache($m_file){
        if(file_exists($m_file)){
            return readfile($m_file);
        }
    }
    public function save_file_cache($m_file,$m_content){
        return file_put_contents($m_file,$m_content);
    }
}
?>

Trong đó:
+ Biến $dircache: dùng để xác định thư mục cache
+ Biến $iscache: dùng để xác định trang này có cần cache hay không
+ Biến $timecache: dùng để xác định thời gian file cache cần tạo lại, mặc định 0 nghĩa là không cần cache lại
+ Hàm load_file_cache(): dùng để load file cache đã được tạo trước đó
+ Hàm save_file_cache(): dùng để tạo file cache mới
Lưu ý:
+ Tất cả các file cache của chúng ta sẽ có tên giống file template nhưng sẽ được lưu trữ ở thư mục dframework/cache (có thể thay đổi thư mục khác qua biến $dircache)
+ Nếu sử dụng trên hosting chúng ta cần set quyền ghi cho thư mục này

Ứng dụng:
Thực hiện Example 4 với yêu cầu sau:
+ In ra danh sách tên xe đã lưu trong database từ ví dụ 3 và cache lại nội dung này
Yêu cầu khi chạy:
+ Nếu lấy nội dung từ database thì hiện thông báo “Dữ liệu được lấy từ Database”
+ Nếu nội dung lấy từ file cache thì hiện thông báo “Dữ liệu được lấy từ File Cache”
+ Nếu thêm biến ?nocache vào URL thì thực thi code mà không sử dụng cache

Lập trình:
+ Trong thư mục dframework/example tạo file example4.php có nội dung sau:
?php
include('../libs/dframework.php');
$tpl = new DFramework;
$tpl->dircache='../cache/';
$tpl->iscache=isset($_GET['nocache'])?false:true;
$tpl->timecache = 60;
$cachefile=$tpl->dircache.'example4.htm';
if(file_exists($cachefile) && ($tpl->iscache && ($tpl->timecache==0 || ($tpl->iscache && $tpl->timecache && (time() - $tpl->timecache < filemtime($cachefile)))))){
    echo 'Dữ liệu được lấy từ File Cache';
}else{
    echo 'Dữ liệu được lấy từ Database';
}
$tpl->loadtemplate('example4.htm');
$tpl->db_connect('localhost','root','rootroot',mydatabase);
$tbl_name='cac_loai_xe';
if($allrows = $tpl->get_rows('select * from '.$tbl_name)){
    foreach($allrows as $rows){
        $tpl->assign('loaixe',$rows,'data');
    }
    $tpl->show_block('loaixe');
}
$tpl->assign($data_assign);
$tpl->display();
?>

+ Trong thư mục dframework/example tạo file example4.htm có nội dung sau:
html>
link rel="stylesheet" type="text/css" href="../css/style.css">
body align="center">
p>
table width="60%" border="1" style="border-collapse: collapse;margin:auto;text-align:center" cellspacing="0" cellpadding="5">
    tr style="background:#f7f7f7">
        td>ID/td>
        td>Name/td>
    /tr>
    {d:block name="loaixe" loop="0"}
    tr>
        td>{data.id}/td>
        td>{data.name}/td>
    /tr>
    {d:/block}
/table>
/body>
/html>

Kết quả:
+ Kết quả khi chạy lần đầu tiên
Dữ liệu được lấy từ Database

+ Kết quả khi chạy lần thứ 2
Dữ liệu được lấy từ File Cache

Kết quả khi chạy với ?nochace
Lấy dữ liệu với nocache

Chúng ta sẽ thấy sự khác biệt khi chạy ví dụ 3 và thêm vào một dòng xe mới, lúc này database đã có cập nhật
Khi chạy lại ví dụ 4 thì sẽ không thấy thay đổi (do vẫn đang chạy file cache cũ) nhưng khi chạy với ?nocache thì sẽ thấy dữ liệu mới.

+ Download toàn bộ mã nguồn tại đây

Nếu xét tổng quát chúng ta sẽ thấy rõ các trường hợp cần xóa file cache.
Trường hợp 1:
+ Nội dung của Example 4 không thay đổi, nó chỉ thay đổi khi có sự thay đổi từ người quản lý Example 3, như vậy ta có thể điều chỉnh Example 3 để khi nó cập nhật thì sẽ xóa file cache của Example 4
Ví dụ các trang nội dung trên website như giới thiệu, quy định sử dụng hoặc các trang sản phẩm, tin tức v.v… chúng ta chỉ cần cache lần đầu tiên, sau này khi có thay đổi dữ liệu mới cần xóa file cache để hệ thống cache nội dung mới.
Trường hợp 2:
+ Nội dung của Example 4 thay đổi thường xuyên: lúc này sẽ không sử dụng chức năng cache cho trang này.
Trường hợp 3:
+ Nội dung của Example 4 thay đổi định kỳ. Ví dụ 20 phút cần cập nhật lại các thông số đo chất lượng nước 1 lần, khi đó chúng ta sẽ cần sử dụng timecache để hệ thống tự động cache lại.

Tổng kết:
Trong phần này chúng ta đã hoàn tất cơ chế cache cho DFramework, tùy thuộc vào nhu cầu khi sử dụng thực tế chúng ta sẽ bật chức năng cache trên từng trang cho phù hợp.


Các tin khác
CÔNG TY TNHH THƯƠNG MẠI DỊCH VỤ THƯƠNG HIỆU TRỰC TUYẾN
Address: 216/14 Bùi Văn Ba, Phường Tân Thuận Đông, Quận 7, Tp.HCM 
Số CNKD: 0310575921 - Ngày cấp: 12/01/2011 - Nơi cấp: Tp.HCM
Hotline: 0908.622.880 - Email: info@thuonghieuonline.vn
Hotline: 0908.622.880 (Mr. Dũng) - Zalo: 0908622880
Email: info@thuonghieuonline.vn
Số Hotline
Zalo