Thứ sáu, 24/01/2014 | 00:00 GMT+7

Cách sử dụng bộ nhớ đệm với Yii Framework để cải thiện hiệu suất


Trong số rất nhiều tính năng mà khung Yii đáng kinh ngạc cung cấp, hệ thống quản lý bộ nhớ cache là thứ không thể thiếu.

Khung công tác Yii cho phép ta lưu cả dữ liệu tĩnh và các truy vấn SQL / Active Record của bạn, điều này -nếu được sử dụng một cách khôn ngoan- có thể dẫn đến tiết kiệm rất nhiều thời gian tải trang.

Đặc biệt, trong hướng dẫn này, ta sẽ học cách lưu dữ liệu và truy vấn vào bộ nhớ cache.

Vì vậy, đây là cách ta kích hoạt bộ nhớ cache trong Yii.

Kích hoạt thành phần Cache


Bước đầu tiên bao gồm việc kích hoạt thành phần bộ nhớ cache. Chỉ cần mở file cấu hình của bạn (nằm trong protected / config /), chuyển đến mảng thành phần và thêm mã sau ngay trong mảng:

'cache'=>array( 
    'class'=>'system.caching.CDbCache'
)

Bằng cách đó, ta đang chọn sử dụng CDbCache , đây chỉ là một trong những Thành phần bộ nhớ đệm có sẵn với Yii. Database cụ thể này lưu trữ dữ liệu đã lưu trong bộ nhớ cache trong database SQLite , giúp cài đặt cực kỳ dễ dàng. Và mặc dù không phải là lựa chọn tốt nhất về mặt hiệu suất, nó vẫn sẽ làm cho ứng dụng web của ta nhanh hơn một chút.

Một lựa chọn khả thi và mạnh mẽ hơn là sử dụng thành phần CApcCache , thành phần này sử dụng APC , hệ thống bộ nhớ đệm tích hợp đi kèm với các version PHP mới nhất.

Vì tất cả các thành phần Cache này đều dựa trên lớp CCache nên bạn có thể dễ dàng chuyển từ một thành phần cache sang một thành phần khác bằng cách thay đổi tên của thành phần (ví dụ: system.caching.CApcCache), trong khi không phải thay đổi bất kỳ mã nào trong suốt ứng dụng của bạn .

Bộ nhớ đệm dữ liệu đơn giản


Cách đầu tiên và đơn giản nhất để sử dụng bộ nhớ cache là lưu trữ các biến. Để làm điều đó, thành phần bộ nhớ cache của Yii cung cấp cho bạn hai hàm: get ()set () .

Vì vậy, ta bắt đầu bằng cách đặt một giá trị được lưu vào bộ nhớ đệm. Để làm như vậy, ta cũng sẽ phải gán cho nó một ID duy nhất. Ví dụ:

// Storing $value in Cache
$value = "This is a variable that I am storing";
$id    = "myValue";
$time  = 30; // in seconds

Yii::app()->cache->set($id, $value, $time);

Giá trị cuối cùng, $time , là không bắt buộc, mặc dù hữu ích để tránh lưu trữ một giá trị mãi mãi khi không cần thiết.

Nhận giá trị được lưu trữ là không đáng kể:

Yii::app()->cache->get($id);

Nếu giá trị không được tìm thấy (vì nó không tồn tại hoặc vì nó đã hết hạn trước đó), hàm này sẽ trả về một giá trị sai . Vì vậy, ví dụ, một cách hay để kiểm tra xem một giá trị nhất định có được lưu vào bộ nhớ đệm hay không sẽ là:

$val = Yii::app()->cache->get($id);
if (!$val):
    // the value is not cached, do something here
else:
    // the value is cached, do something else here
endif;

Xóa giá trị đã lưu trong bộ nhớ đệm


Để xóa một giá trị được lưu trong bộ nhớ cache, ta có thể gọi:

Yii::app()->cache->delete($id);

Nếu những gì ta cần là làm sạch mọi thứ, ta sẽ chỉ viết:

Yii::app()->cache->flush();

Truy vấn Cache


Được xây dựng dựa trên hệ thống Bộ nhớ đệm dữ liệu, đây là một tính năng rất hữu ích, đặc biệt đối với các ứng dụng nặng dựa nhiều vào Database .

Khái niệm về tính năng này khá dễ dàng nhưng khá chắc chắn.

Đầu tiên, những gì ta phải làm là xác định một truy vấn phụ thuộc . Nói cách khác, ta định nghĩa một Truy vấn Database đơn giản và nhẹ nhàng hơn nhiều mà ta sẽ gọi trước truy vấn mà ta thực sự cần. Lý do để làm điều đó là để kiểm tra xem có điều gì thay đổi kể từ lần cuối cùng ta thực hiện truy vấn đó hay không.

Ví dụ: nếu dữ liệu ta muốn truy xuất là danh sách các Tác giả Sách, thì truy vấn phụ thuộc của ta có thể là:

SELECT MAX(id) FROM authors

Làm như vậy, ta sẽ có thể xem liệu có bất kỳ tác giả mới nào đã được thêm vào kể từ lần cuối ta kiểm tra hay không. Nếu không có tác giả mới nào được thêm vào, thành phần Bộ nhớ cache của Yii sẽ lấy danh sách Tác giả trực tiếp từ bộ nhớ cache mà không cần thực hiện lại truy vấn lớn của ta , có thể là:

SELECT authors.*, book.title 
FROM authors 
JOIN book ON book.id = authors.book_id

Yii Query Builder


Để sử dụng Cache truy vấn với Trình tạo truy vấn Yii, Đây là kết quả ta phải viết [sử dụng ví dụ của Tác giả đã hiển thị trước đây]:

// big query
$query = ' SELECT authors.*, book.title 
FROM authors 
JOIN book ON book.id = authors.book_id';
// dependency query 
$dependency = new CDbCacheDependency('SELECT MAX(id) FROM authors'); 
// executing query using Yii Query Builder
$result = Yii::app()->db->cache(1000, $dependency)->createCommand($query)->queryAll();

Các đối số được truyền tới Yii::app()->db->cache() tương ứng là lượng giây mà kết quả sẽ được lưu trữ và truy vấn phụ thuộc.

Như đã giải thích trước đó, khi chạy mã này, Yii sẽ kiểm tra kết quả của truy vấn phụ thuộc trước bất kỳ thứ gì khác. Nếu nó không tìm thấy bất kỳ thứ gì hoặc giá trị khác với giá trị được lưu trữ trước đó, nó sẽ thực hiện truy vấn lớn và lưu trữ kết quả trong bộ nhớ cache. Nếu không, nó sẽ extract kết quả truy vấn lớn từ bộ nhớ cache.

Bản ghi hoạt động


Cũng có thể lưu vào cache kết quả của một truy vấn được thực hiện bằng Active Record . Khái niệm vẫn giống như đã giải thích trước đây; nhưng với một cú pháp khác, tất nhiên:

$dependency = new CDbCacheDependency('SELECT MAX(id) FROM authors');
$authors = Author::model()->cache(1000, $dependency)->with('book')->findAll();

Những điều cần lưu ý


Rõ ràng là một ứng dụng sử dụng nhiều bộ nhớ đệm cần phải được thiết kế tốt trước, vì nguy cơ cung cấp dữ liệu không nhất quán cho user chắc chắn sẽ tăng lên.

Ngoài ra, đừng quên rằng mỗi thành phần bộ nhớ đệm có thể có giới hạn về số lượng dữ liệu có thể được lưu trữ. Do đó, bạn nên tìm hiểu trước giới hạn của hệ thống bộ nhớ đệm của bạn .

<div class = “author”> Gửi bởi: <a href=osystemhttps://twitter.com/marcotroisiosystem> Marco Troisi </a> </div>


Tags:

Các tin liên quan