Học Drupal nâng cao




Bạn muốn học Drupal? Bạn đam mê hứng thú với OpenSource này và muốn tìm hiểu sâu hơn?
Hãy đến với những bài viết của chúng tôi dưới đây, bạn sẽ có đầy đủ những gì cần thiết để học Drupal cũng như muốn nâng cao hiểu biết của mình về Drupal - 1 OpenSource khá thông dụng này:


Giới thiệu cách đệm dữ liệu sử dụng Drupal API

Khi xây dựng ứng dụng web với nhiều câu truy vấn phức tạp, chúng ta hẳn phải nghĩ đến việc xây dựng cho ứng dụng của mình một hệ thống đệm.

Đệm mềm

Một hệ thống tối ưu về tốc độ không bao giờ thực hiện hai lần một xử lý phức tạp. Tinh thần này được thể hiện ở hàm sau:
<?phpfunction my_module_function($reset) {
  static
$my_data;
  if(!
$reset){
   
// các tính toán phức tạp P
    // giá trị được lưu lại trong biến $my_data
    // ...
 
}
  return
$my_data}?>
Vì biến $my_data được khai báo với từ khóa static, nên giá trị của nó, khi được gán, sẽ tồn tại trong suốt trang web được tải. Rõ ràng, nếu như hàm my_module_function() được gọi hơn một lần khi một trang web nào đó trong hệ thống của bạn được tải, thì các tính toán phức tạp (***) chỉ phải thực hiện có một lần.
Vì kỹ thuật đệm ở đây là mềm, nên chúng ta dễ dàng thấy được giới hạn của nó: Giả sử, mỗi lần trang web X của bạn được gọi, hàm my_module_function được gọi đến 5 lần. Trong thời điểm y, có 100 người yêu cầu trang web X của bạn, thì số lần tính toán phức tạp P phải được thực hiện là 100.
Để giảm thiểu số lần các tính toán phức tạp được thực hiện, chúng ta có thể kết hợp kỹ thuật đệm mềm với kỹ thuật đệm cứng.

Đệm cứng

Ý tưởng đệm cứng được nêu ra: lưu kết quả của các tính toán phức tạp P vào một bảng dữ liệu có cấu trúc rất đơn giản; khi P được gọi lần thứ 2, thì P được thay thế bằng một câu truy vấn nhẹ nhàng. Thí dụ:
<?phpfunction my_module_function($reset = FALSE) {
  static
$my_data;
  if (!isset(
$my_data) || $reset) {
    if (!
$reset && ($cache = cache_get('my_module_data')) && !empty($cache->data)) {
     
$my_data = unserialize($cache->data);
    }
    else {
     
// các tính toán phức tạp P
      // giá trị được lưu lại trong biến $my_data
      // ...
     
cache_set('my_module_data', 'cache', serialize($my_data));
    }
  }
  return
$my_data;
}
?>
Ở thí dụ trên, hàm của chúng ta được nâng cấp lên một phiên bản hiện đại hơn, kết hợp 2 kỹ thuật: cứng và mềm - cấu trúc điều khiển ngoài thể hiện kỹ thuật đệm mềm, cấu trúc điều khiển trong thể hiện kỹ thuật đệm cứng. Ở kỹ thuật đệm cứng, chúng ta thấy, nếu như kết quả của các xử lý phức tạp P chưa được đệm,
<?php
   
if (!$reset && ($cache = cache_get('my_module_data')) && !empty($cache->data)) {?>

thì P mới được thực hiện, khi P được thực hiện xong, kết quả được đệm lại:
<?php
      cache_set
('my_module_data', 'cache', serialize($my_data));?>

Các hàm khóa của Drupal API

Để công việc của người phát triển module nhẹ nhàng hơn, Drupal API cung cấp 3 hàm cho việc đệm dữ liệu:
  1. cache_clear_all ($cid = NULL, $table = NULL, $wildcard = FALSE)
Mô tả: xóa dữ liệu đệm khỏi cơ sở dữ liệu. Nếu hàm được gọi không có tham số, tất cả nội dung đệm trong bảng cache_page sẽ được xóa.
Các tham số:
$cid, là mã số của nội dung đệm, nếu được thiết lập, thì chỉ phần nội đệm có đúng mã số này mới được xóa.
$table, là tên của bảng dữ liệu chứa nội dung đệm, tham số này là cần thiết nếu như $cidđược thiết lập.
$wildcard, tham số dạng BOOLE, nếu được thiết lập là TRUE$cid chỉ được xem làm một chuỗi con, đại diện cho các vùng dữ liệu đệm có ID tương tự, ràng buộc từ trái sang phải. Thí dụ:
<?php// xóa các vùng đệm có mã số bắt đầu bằng 'MyModule_' trong bảng 'cache_page'cache_clear_all('MyModule_', 'cache_page', TRUE);// xóa tất cả dữ liệu đệm trong bảng 'cache_views'cache_clear_all('*', 'cache_views', TRUE);?>
  1. cache_set ($cid, $table = 'cache', $data, $expire = CACHE_PERMANENT, $headers = NULL)
Mô tả: phục vụ việc đệm cứng dữ liệu. Drupal có 4 bảng dữ liệu để phục vụ cho việc đệm cứng dữ liệu:
cache_page: Bảng các trang web được tạo ra cho người xem web nặc danh (anonymous)
cache_menu: Bảng lưu trữ các thành phần menu của người dùng có thể đệm. Sẽ rõ hơn khi tìm hiểu về hệ thống menu của Drupal
cache_filter: Bảng lưu trữ đệm các phần nội dung đã được lọc. Phần nội dung đệm trong bảng này sẽ được xóa theo chu kỳ (cron job chạy).
cache: Bảng dữ liệu đệm các dữ liệu chung chung.
Có một số lý do để chúng sử dụng đến 4 bảng để phục vụ cho việc đệm dữ liệu thay vì 1:
+ Bảng càng nhỏ và đơn giản thì phục vụ càng nhanh nhẹn hơn cho các truy vấn SELECT và INSERT
+ Đơn giản cho các xử lý của hệ thống.
Nếu module của chúng ta cần đệm khá nhiều dữ liệu, thì chúng ta có thể tự định nghĩa các bảng đệm riêng để đảm bảo vấn đề tốc độ.
  • Các tham số
  • $cid: mã số của phần nội dung được đệm
  • $table: bảng dữ liệu phục vụ cho việc đệm dữ liệu
  • $data: nội dung được đệm
  • $expire: thời gian có hiệu lực của dữ liệu đệm, được gán là một trong các giá trị sau:
  • CACHE_PERMANENT: chỉ định rằng nội dung đệm luôn có hiệu lực. Khi bị xóa đi khi[http://api.drupal.org/api/function/cache_clear_all/5|cache_clear_all] được gọi với tham số $cid được truyền vào.
  • CACHE_TEMPORARY: chỉ định rằng nội dung đệm này cần được xóa bỏ ở lần dọn dẹp nội dung đệm tiếp theo.
  • timestamp: nội dung đệm được chỉ định rằng sẽ bị vô hiệu vào đúng thời điểm được chỉ định. Xem thêm về timestamp ở WikiPedia
  • $headers: Một chuỗi chứa các HTTP Header cho trang nội dung được đệm.
Thí dụ, đệm nội dung vào bảng 'cache', nội dung đệm có hiệu lực trong vòng 1 giờ:
<?php
cache_set
('MyModule_test_01' , 'Nội dung cần được đệm', time()+3600);?>
  1. cache_get ($key, $table = 'cache')
Mô tả: Lấy ra nội dung đã được đệm cứng.
Các tham số:
$key: Mã số của nội dung đã được đệm
$table: bảng dữ liệu phục vụ cho việc đệm nội dung
Kết quả trả về của hàm này:
* Là số 0, nếu như dữ liệu đệm đã hết hạn hoặc không được tìm thấy.
* Nếu dữ liệu hợp lệ, kết quả trả về là một đối tượng gồm các thuộc tính:
data: nội dung đã được đệm.
created: thời điểm nội dung được đệm.
headers: các HTTP header.
expire: thời gian có hiệu lực của nội dung đệm, các giá trị có thể có được giới thiệu trong hàm cache_set()

Đệm nâng cao

  1. Ba hàm đệm mà Drupal API cung cấp đều có tham số thứ hai là tên của bảng dữ liệu lưu trữ dữ liệu cần đệm. Nếu như dữ liệu mà module của bạn phục vụ là khá lớn thì việc tạo nên một, hai hay nhiều hơn nữa các bảng đệm là cần thiết. Module Views, một module rất nổi tiếng của Drupal đã sử dụng thủ thuật này.
  2. Nếu dữ liệu cần lưu trữ không đơn thuần là một chuỗi, bạn có thể kết hợp hàm [codefilter_code]serialize/codefilter_code và [codefilter_code]unserialize/codefilter_codecủa PHP.
  3. Có thể kết hợp với kỹ thuật đệm ở bộ nhớ (memcache)để tăng độ tối ưu cho ứng dụng.

    Đọc thêm - Học Drupal
    Đọc thêm - hiểu biết về Drupal
    Đọc thêm - Drupal nâng cao - 1. Cơ chế Hook
    Đọc thêm - Drupal nâng cao - 2. Working with Database

1 nhận xét:

  1. Ủa bài này là tui viết mà, copy cũng phải để tên tui chứ :P

    Trả lờiXóa