Hướng dẫn Caching tăng tốc website trong CakePHP 2

Tiếp theo trong series CakePHP mình sẽ giới thiệu về việc sử dụng Cache xuất ra file, đương nhiên CakePHP còn hỗ trợ các loại cache khác như: ApcCache, Wincache, MemcacheEngine… lưu trên Ram vật lý nhưng nó là một vấn đề khác sẽ tìm hiểu sau vậy.

Link tham khảo thêm https://book.cakephp.org/2.0/en/core-libraries/helpers/cache.html

Yêu cầu:

  1. Source code bài mới nhất trong series CakePHP của mình bao gồm cả database. Tại đây nút Download
  2. Download source về chạy nếu có lỗi permission về thư mục thì phần quyền lại thư mục app/tmp

Làm quen: Chúng ta cùng truy cập vào app/tmp/cache , đây là thư mục lưu các file cache, sẽ có 3 thư mục tương ứng: models, persistent, views

  • models: chứa các file cache model tương ứng với từng bảng trong cơ sở dữ liệu.
  • persistent: chứa các file cache lưu vị trí các lớp, đối tượng, tệp tin trên thư mục, nó sẽ giúp CakePHP không phải quét toàn bộ để tìm hoặc tải các controller,  helper…
  • views: chứa các file cache dạng view(html, css).

Mặc định CakePHP đã tự cache 2 loại models và persistent, nó được cấu hình các thông số trong file app/Config/core.php đoạn cuối file.

tất cả các thư mục trong app/tmp/cache thì cần có quyền đọc ghi nên chú ý phân quyền nó nhé.

Cache API

static Cache::config($name = null$settings = array())

dùng đặt lại cấu hình các thông số cho cache:

  1. duration: thời gian tồn tại file cache.
  2. engines: loại cache.
  3. paths: đường dẫn lưu file cache.
  4. prefixes: tiền tố tên file cache.

static Cache::read($key$config = ‘default’)

Cache :: read () được sử dụng để đọc các giá trị cache lưu trữ trong $key từ $config. Nếu $config là null, cấu hình mặc định sẽ được sử dụng. Cache :: read () sẽ trả lại giá trị của cache nếu nó hợp lệ hoặc false nếu bộ nhớ cache đã hết hạn hoặc không tồn tại. Khi kiểm tra giá trị trả về CakePHP khuyên nên sử dụng các toán tử: === or! ==.

static Cache::write($key$value$config = ‘default’)

Cache :: write () sẽ ghi một giá trị cho Cache. Có thể read() hoặc delete() giá trị này bằng cách sử dụng $key. Bạn cũng có thể chỉ định cấu hình để lưu trữ bộ nhớ cache. Nếu không có $config được chỉ định, mặc định sẽ được sử dụng.

static Cache::delete($key$config = ‘default’): sử dụng để xoá một đối tượng cache bằng $key

static Cache::set($settings = array()$value = null$config = ‘default’)

sẽ được sử dụng để ghi dè tạm thời các cấu hình mặc định, nếu dùng trước write, thì khi đọc lại cũng cần sử dụng set lại, nếu không sử dụng set lại nó sẽ lấy lại cấu hình mặc định.

Cache::set(array('duration' => '+30 days'));
Cache::write('results', $data);

// Later on

Cache::set(array('duration' => '+30 days'));
$results = Cache::read('results');

Trên là các hàm sử dụng thường xuyên khi cache, còn có các hàm khác nữa, các bạn nghiên cứu thêm trong phần tham khảo nhá.

Lý thuyết là thế chứ thực hành thì rất đơn giản.

Trước khi vào thực hành thì mình xin giới thiệu môt Plugin để debug trong CakePHP: DebugKit, sử dụng nó để kiểm tra hoạt động của cache, nó còn nhiều công dụng lắm, các bạn tự tìm hiểu thêm nhá.

  • Tải về tại đây: giải nén đổi tên thành thư mục DebugKit, rồi copy vào app/Plugin
  • Mở file app/Config/bootstrap.php thêm vào đoạn sau: CakePlugin::load(‘DebugKit’);
  • Mở file app/Controller/AppController.php: thêm ‘DebugKit.Toolbar’ vào biến $components để có thể sử dụng trên toàn website.

Load lại website ta sẽ được như ảnh:

Plugin DebugKit.Toolbar cakePHP

Sử dụng Cache::write() and Cache::read() để giảm tải lượng request đến database bằng cách sau:

Ở đây mình sẽ cache lại câu sql của menu trên website, mở file app/Controller/CategoriesController.php tìm function menu() và thay thế toàn bộ thành như sau(ở đây mình đặt tên là menu các thông số còn lại để mặc định):


public function menu(){
$result = Cache::read('menu');
if (!$result) {
$result = $this->Category->find('all', array('fields' => array('id', 'name','parent_id'),'conditions'=>array(' parent_id=0'),'order'=>array('id'=>'asc'), 'recursive'=>-1));
Cache::write('menu', $result);
}
return $result;
}

Load lại website, mở debugKit ở tab SQL Log sẽ thấy có 4 câu sql trong đó có câu chúng ta lấy ra menu


SELECT `Category`.`id`, `Category`.`name`, `Category`.`parent_id` FROM `doctruyen`.`categories` AS `Category` WHERE parent_id=0 ORDER BY `id` asc

vào thư mục app/tmp/cache sẽ thấy xuất hiện 2 file cake_menu(cái chúng ta cache ở CategoriesController) và cake_toolbar_cache(cache của debugKit tự tạo)

Tiếp theo load lại website lần nữa, mở debugKit ở tab SQL Log sẽ thấy có 3 câu sql không còn câu chúng ta lấy ra menu nữa, nó sẽ lấy từ file cake_menu, trong thời gian tồn tại của Cache mặc định nếu chúng ta thay đổi dữ liệu trong database thì bên ngoài sẽ không thay đổi ngay, nếu muốn thì phải sử dụng Cache::delete(“menu”) phần cập nhật trong CategoriesController.php hoặc vào thư mục app/tmp/cache xoá file cake_menu đi.

CacheHelper

Dùng để lưu cache giao diện hiển thị trong khoảng thời gian chỉ định, có tuỳ biến không lưu đoạn nào ở ngoài view. Để sử dụng ta cần thực hiện các bước sau:

Bước 1: Vào app/Config/core.php tìm


//Configure::write('Cache.check', true);

thay thế bằng:


Configure::write('Cache.check', true);

Bước 2: mở file /app/Config/bootstrap.php xem có đoạn sau này chưa, nếu chưa thì thêm vào cho giống


Configure::write('Dispatcher.filters', array(
'AssetDispatcher',
'CacheDispatcher'
));

Bước 3: Khai báo helper nếu muốn sử dụng toàn bộ controller thì khai báo ở AppController.php. Ở đây mình sử dụng ở app/Controller/PagesController.php nên khai báo thêm Cache trong biến $helpers


public $helpers = array('Js','Paginator','Html', 'Cache');

Việc sử dụng cache chỉ được hoạt động khi khai báo biến $cacheAction, ý nghĩa của biến này là khai báo tên action và time tồn tại của file cache. Mình sẽ cache action index(trang chủ) cú pháp như sau:


public $cacheAction = array(
'index' => array('callbacks' => true, 'duration' => 3600),
);

Để dưới biến $helpers nhá, tiến hành load lại website trang chủ, vào thư mục /app/tmp/cache/views/ sẽ thấy xuất hiện một file .php nó là file cache của chúng ta. Từ đây khi truy cập trang chủ nó sẽ đọc file này lên. Để kiểm tra xem nó có hoạt động hay không các bạn cứ vào file view của trang chủ xoá toàn bộ nội dung đi save lại và chạy lại trang chủ (app/View/Pages/index.ctp) nội dung vẫn hiển thị bình thường là đã thành công.

Bước 4: Không cache những phần được chỉ định(bước này tạm thời không thể làm được mình không kiểm tra được có thể do phiên bản CakePHP hẹn lại sau vậy).

Bước 5: Xoá Cache

Trong trường hợp Insert , Update hay Delete mà bạn muốn dữ liệu mới được cập nhật ngay thì ta dùng hàm sau khi thực hiện các thao tác đó:


Cache::clear()

Nếu cần xóa thủ công bộ nhớ cache, bạn có thể thực hiện bằng cách gọi Cache::clear(). Thao tác này sẽ xóa tất cả dữ liệu đã lưu trong bộ nhớ cache, ngoại trừ các file trong chế độ cache view được lưu trong bộ nhớ cache. Nếu bạn cần xóa các file trong chế độ cache view, hãy sử dụng clearCache().

Để test bước này chúng ta tạo ra một action nội dung như sau:


public function xoacache(){
//Cache::clear();//Xoá toàn bộ cache trừ cache/views
clearCache();//xoá cache/views
echo 1;
exit;
}

Chạy link http://doctruyen.local/pages/xoacache/ để tiến hành xoá từng loại và kiểm tra bằng cách xem các file trong app/tmp/cache/

Việc sử dụng Plugin DebugKit chúng ta chỉ nên sử dụng ở localhost, khi chạy chính thức nên ẩn nó đi trong AppController.php.

Ở phần bước 4 mình chưa test được nên phần đó các bạn tạm thời bỏ qua nhá.

Kết luận

  1. Nếu có thắc mắc gì các bạn để lại comment bên dưới mình sẽ trả lời sớm nhất có thể.
  2. Cảm ơn các bạn đã đọc.

Nongdanit.info

 

 

[Cakephp] Hướng dẫn Caching tăng tốc website CakePHP
Tagged on: