Dương Văn Bốn Dương Văn Bốn
9.9 10 592648 Designed by

Thứ Hai, 28 tháng 4, 2014

Vấn đề về drupal cache

Vấn đề về drupal cache

Mọi người cho em hỏi 1 vấn đề về cache của drupal. Drupal có sẵn 1 module cache trong core.
Theo như em hiểu thì mỗi biến cache có 1 timelife tồn tại, hết timelife đó nó tự xóa, và mỗi khi database có thay đổi thì những cache có liên quan cũng sẽ xóa và cập nhật cache mới.
Vậy drupal làm thế nào để biết 1 table liên quan đến những cache nào mà xóa những cache đó???
bạn có thể tham khảo 1 số ý kiến sau:



1/ Ở Drupal 7, Drupal hỗ trợ cache trong Database, thông thường các table cache được đặt tên là: cache, cache_xxx (với xxx là suffix, ví dụ: cache_form: cache form). Table cache thường có các cột sau:
  • cid: cache id -> nó là duy nhất
  • data: dữ liệu cache được lưu ở đây
  • expire: thời gian cache này hết hạn
  • created: thời gian khi khởi tạo cache
  • serialized: có giá trị 0,1 (1: cho biết có serialize cái dữ liệu cache hay không, còn muốn biết serialize là gì thì hỏi Google).
Để truy xuất cache thì có thể dùng 2 phương thức: cache_set (-http://api.drupal.org/api/drupal/includes!cache.inc/function/cache_set/7 - lưu dữ liệu) cache_get (http://api.drupal.org/api/drupal/includes!cache.inc/function/cache_get/7 - lấy dữ liệu).
Thông thường cách nhận biết cache thì dựa vào tên bảng table mà nhận biết ví dụ qua tên: cache, cache_xxx, nhưng cũng tùy thuộc vào cách viết module đó nữa, ví dụ views thì có 2 bảng cache cache_views, và cache_views_data, nhưng không bắt buộc, bạn có thể viết module của mình đặt tên bảng cache bất kì thứ gì cũng được. Nhưng khuyến khích đặt theo chuẩn cache_xxx cho dễ nhận biết.
Ngoài ra còn có một số loại cache khác cho Drupal ví dụ như memcache, redis bạn có thể tìm hiểu thêm.


2/Đúng như bạn hiểu, hệ thống cache của Drupal được lưu trữ trên các "cache bin" khác nhau. Đối với mặc định là DatabaseCache thì đó là các table như cache_bootstrap, cache_form, cache_page...
Mỗi bin có các cache_id để phân biệt. Và mỗi cache_id này đều có timelife, khi quá thời gian cho phép thì hệ thống sẽ tự động xóa các dữ liệu của các cache_id đó đi.
Câu hỏi số 2 của bạn: Các module phải tự cập nhật cache chứ Drupal không tự xóa khi bạn cập nhật ở database. Bạn sử dụng hàm cache_clear_all để xóa.

@Nguyễn Tiến Sỹ: vì em đang tìm hiểu về memcache để cache vô ram tăng thêm performance, nhưng khi cài thử nó thì chỉ cần config là chạy, chứ không code thêm gì nữa, nên em nghĩ nó hook lại các hàm xử lý cache sẵn trong core, mới tìm hiểu về cache core :)
@Lê Thanh Sang: Vậy là nếu không dùng module mà tự viết query thì mình phải tự quản lý cache của mình, khi update thì xóa để tạo mới đúng không a? Thanks a, e đã hiểu


3Đúng vậy, chỉ cần hiểu nguyên tắc lưu giữ cache đó thì bạn có thể triển khai hệ thống cache trên memcache, redis hay mongodb hoặc 1 hệ thống của riêng bạn.
Lưu ý là bin cache_form phải luôn được lưu ở Database nhé.

Không có nhận xét nào:

Đăng nhận xét