Drupal 7 cache/緩存入門指南

使用Drupal構建複雜而動態的內容是件很容易的事情。可是稍有不慎,你會爲這種容易付出代價。在用戶查看某些複雜而動態的頁面的時候,複雜的數據庫查詢,與高花銷的計算會致使頁面性能方面的問題。 php

解決方案之一是在Druapl的後臺頁面開啓頁面緩存。頁面緩存開啓後,能夠在某些頁面極大的下降數據庫查詢次數從而提升頁面性能。可是這有必定的侷限性,就是頁面緩存僅僅對匿名用戶有效。對應登陸用戶則會生效。 數據庫

逐漸的,你可能會分析本身寫過的代碼,找出數據出查詢的熱點進行緩存優化。幸運的是,Drupal已經內置了一些緩存API,若是遵循下面的一些規則,能夠將你的代碼優化工做變得更容易。 緩存

基本規則: 服務器

規則:若是計算結果能夠重用或存儲,就不要計算兩次。 函數

下面的簡單例子用來演示這種狀況。 性能

1
2
3
4
5
6
7
function my_module_function() {
  $my_data = &drupal_static(__FUNCTION__);
  if (!isset($my_data)) {
    //將一些高花銷的計算邏輯寫在這裏,並將結果賦值給$my_data變量。
  }
  return $my_data;
}

理解上面的的代碼,須要必定的php基礎知識。 優化

首先是知道php有個變量類型是靜態變量(static)。drupal_static函數其實就是實現static變量的集中管理。 spa

其次是函數前加"&"符號,這種是按址傳值。這樣的話,對$my_data變量的任何更改,對&drupal_static(__FUNCTION__)都會相應更改。 unix

這兩點理解後再來看上面的邏輯,發現雖然只有一個if判斷,但其實這段代碼是精妙無比的。 orm

進階:善用Drupal的cache函數。

在上面的代碼中,靜態變量的數據只會在一次的頁面加載過程當中有效。若是從新訪問該頁面,則會從新進行數據的計算。就是說靜態變量緩存的數據只是暫時的,沒有長久的存儲起來。下面的代碼,演示如何將複雜的計算結果的數據存儲到drupal的cache表中,從而實現長久存儲的目的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function my_module_function() {
  $my_data = &drupal_static(__FUNCTION__);
  if (!isset($my_data)) {
    if ($cache = cache_get('my_module_data')) {
      $my_data = $cache->data;
    }
    else {
      //將一些高花銷的計算邏輯寫在這裏,並將結果賦值給$my_data變量。
      //這裏將計算的結果保存到cache表中。
      cache_set('my_module_data', $my_data, 'cache');
    }
  }
  return $my_data;
}

上面的例子,結合了cache_set與cache_get,對計算出的結果數據緩存到Drupal的cache表中;在第一次執行的時候,須要複雜計算;可是第二次執行這段代碼的時候,數據內容會直接從cache表中讀取,從而避免複雜的計算開銷或數據庫查詢,有一次提高代碼執行的效率。

緩存數據更新

若是使用cache_set()方式設置的cache數據過時了怎麼辦?默認狀況下,cache_set設置的緩存會一直存儲在數據庫中,直到你調用cache_clear_all()函數進行強制清空緩存(若是安裝了admin_menu模塊,使用admin menu提供的清空緩存功能也能夠清除cache表的緩存)。

若是你的數據是比較零散的更新,能夠在每次數據更新的時候,調用cache_clear_all('my_module_data', 'cache')進行緩存數據的更新。若是是存儲的一些有規律的數據片斷,能夠經過以下方式使用通配符的方式進行清空緩存。

1
cache_clear_all('my_module', 'cache', TRUE);

這種方式會清空全部以my_module爲開頭的緩存。

若是你的緩存的過時時間是有規律的,能夠預測的,能夠嘗試使用下面方式來給緩存設置過時時間。

1
cache_set('my_module_data', $my_data, 'cache', time() + 3600);

最後一個參數是unix時間戳,表示是緩存的過時時間。在這個例子中,緩存在設置的一個小時後過時,緩存中的數據自動被丟棄。

定製本身的緩存表

在上面的代碼展現過程當中,若是你細心,你會發現cache_set()函數的第三個參數"cache",這個實際上是表明cache的數據表的名字。若是你須要使用大量的緩存,最好可使用一個獨立的數據表來存數緩存數據;這樣有利於加速數據查詢的速度。大名鼎鼎的views模塊就使用了這種技術來實現其緩存控制策略。

最簡單,最Drupal化的定製自定義緩存表的方式,是在模塊的install文件裏執行hook_schema().如下是例子:

1
2
3
4
function mymodule_schema() {
  $schema['cache_mymodule'] = drupal_get_schema_unprocessed('system', 'cache');
  return $schema;
}

上面的函數中的drupal_get_schema_unprocessed('system', 'cache')用來獲取Drupal默認的cache表結構的定義供cache_mymodule表使用。

若是你想完全壓榨服務器的性能,只要在settings.php文件裏添加少許代碼,就可讓Drupal cache_set,cache_get等函數調用的cache系統用其餘的緩存系統來替換。好比廣受歡迎的memcache(基於內存的緩存,效率極高),APC(基於文件的緩存)等。只要使用標準的Drupal cache函數,即便更改了緩存系統,也不須要修改你的代碼。

一些注意點:

1:切勿爲了緩存而緩存。好比從數據庫查詢一條結果,將一條結果寫入數據庫,這些都是很輕的操做,不必使用緩存。推薦使用devel模塊來查找代碼方面性能瓶頸並進行鍼對性的優化。

2:緩存表存數的數據都是blob類型的,切勿作與cache表的join查詢。

3:切記緩存中的數據不是永久存儲的。任何調用cache_clear_all的代碼都會清空緩存。所以沒法經過重複計算獲取的數據,切勿存儲到緩存表。

向前衝吧,風騷的Drupalor們!

如今,若是你認真讀完此文並消化吸取,那麼恭喜你:你掌握了一把加速你代碼的利器!繼續前進,繼續優化!

相關文章
相關標籤/搜索