Drupal7之drupal_static函數(shù)用法解析

Drupal7 非常強(qiáng)大,其強(qiáng)大核心之一是entity field模式,比如node/taxonomy term/ user 都是一種entity, 并且支持field模式,也就是用戶可以隨意的添加新的field給node/taxonomy term/user;
強(qiáng)大的背后是性能的擔(dān)憂;加入node有10個(gè)field,那么就對(duì)應(yīng)10個(gè)表來裝載field數(shù)據(jù),而不是一個(gè)列,這就導(dǎo)致了至少10個(gè)join 去查詢一個(gè)node. 這對(duì)數(shù)據(jù)庫(kù)的性能影響是巨大,甚至是致命的;試想,如果一個(gè)頁(yè)面有10個(gè)block, 每個(gè)block包含10個(gè)node, 每個(gè)node有10個(gè)field, 那么查詢表的次數(shù)就是10次(使用entity_load_multiple),join的次數(shù)是100次;
我們幾乎沒有直接的辦法解決這個(gè)問題,畢竟這就是Drupal.
在這里我們提供一個(gè)小的性能優(yōu)化辦法,即使用drupal_static函數(shù),這個(gè)優(yōu)化方法是PHP級(jí)別的,需要了解基本的PHP知識(shí)。
這個(gè)函數(shù)可以緩存函數(shù)執(zhí)行結(jié)果,保證在函數(shù)執(zhí)行退出后,結(jié)果存在內(nèi)存中,但是又不同于memcache,它在一個(gè)請(qǐng)求結(jié)束后就自動(dòng)釋放。
這里舉個(gè)例子:
現(xiàn)在有這樣子的需求,頁(yè)面上有2個(gè)block: last_news block, last_comment block,內(nèi)容要求是last_comment 需要10條,首先取last_news 的comment, 如果不足,則按照時(shí)間先后順序取出除了和last_news comment 匹配的項(xiàng);
分析下,last_news block保護(hù)了last_news 數(shù)據(jù),在last_comment 也需要這個(gè)數(shù)據(jù),假設(shè)有方法叫: news_last_news_data() 返回這個(gè)last_news,
函數(shù)原型:
則需要調(diào)用2次,那么數(shù)據(jù)庫(kù)也需要查詢2次,相對(duì)的JOIN問題也會(huì)凸顯,在并發(fā)量情況下,比如20,那么數(shù)據(jù)庫(kù)來說就有20次查詢,壓力還是有點(diǎn)的怕,在1G內(nèi)存下VPS應(yīng)該是撐不住這個(gè)并發(fā)了;
怎么辦?我們要減少數(shù)據(jù)庫(kù)的請(qǐng)求,分析,我們看到news_last_news_data()不需要參數(shù),功能也就是查詢而已,我們斷定每次調(diào)用返回的結(jié)果都是一樣。那么我們有沒有辦法緩存查詢結(jié)果?
有! drupal_static來了.
看下面?zhèn)未a:
$last_news = &drupal_static(__FUNCTION__, array());
if (empty($last_news)) {
// 那么我們?cè)谶@里就查詢
$last_news = query();
}
return $last_news;
}
分析如下:
第一行,我調(diào)用了drupal_static()方法,第一個(gè)參數(shù)是一個(gè)key, key是唯一鍵,這里使用魔法常量__FUNCTION__表示, 代表著使用方法名作為key, 第二個(gè)參數(shù)是默認(rèn)值,當(dāng)緩存不存在的時(shí)候使用一個(gè)空的數(shù)組替代
第二行,我加了一個(gè)判斷,如果$last_news緩存已經(jīng)存在,則不執(zhí)行查詢,這樣就減少了這個(gè)查詢的一半的壓力,運(yùn)行一下,速度是不是很塊!
后面的代碼你應(yīng)該懂了吧!
此處還要注意:在php5.1.13有一個(gè)BUG, 也是我使用過程中遇到的,意思是當(dāng)在匿名方法里面使用use關(guān)鍵字調(diào)用匿名方法上層的變量,且這個(gè)變量是來自drupal_static的返回值,那么匿名方法執(zhí)行完后,會(huì)修改上層的變量的引用,也就是在后面引用到這個(gè)變量,那么這個(gè)變量以及不是drupal_static的返回值,所以緩存會(huì)失效。這個(gè)BUG說的很復(fù)雜,遇到后就看看是否使用了匿名方法吧。
相關(guān)文章
- drupal模塊開發(fā)分析,方便想要drupal模塊開發(fā)的朋友2012-12-06
drupal 自定義表單調(diào)用autocomplete主標(biāo)簽實(shí)現(xiàn)代碼
drupal 自定義表單調(diào)用autocomplete主標(biāo)簽實(shí)現(xiàn)代碼,需要的朋友可以參考下2012-12-06CKeditor for Drupal 7 開源在線網(wǎng)頁(yè)編輯插件 v3.6.3
CKeditor是一款在線網(wǎng)頁(yè)編輯插件(用瀏覽器編輯后所見即所得),支持多種平臺(tái)下的腳本(asp aspx php cfm Dhtml htc),還集成了上傳圖片組件,含簡(jiǎn)、繁中文2012-04-26CKeditor for Drupal 6 在線網(wǎng)頁(yè)編輯器 v3.6.3
CKeditor是一款在線網(wǎng)頁(yè)編輯插件(用瀏覽器編輯后所見即所得),支持多種平臺(tái)下的腳本(asp aspx php cfm Dhtml htc),還集成了上傳圖片組件,含簡(jiǎn)、繁中文2012-04-26- 對(duì)頁(yè)面和靜態(tài)資源的啟用緩存和Gzip壓縮傳輸.2010-01-24
- 真是不看不知道,Drupal 真奇妙。很多使用CMS內(nèi)容管理系統(tǒng)的人可能都會(huì)知道一款國(guó)外的CMS系統(tǒng):Drupal 。在我們傳統(tǒng)的想象中CMS除了能做內(nèi)容文章站外,其他還有圖片站,分2010-01-24
php 內(nèi)容管理系統(tǒng) Drupal v8.9.17
Drupal是一個(gè)開源的內(nèi)容管理系統(tǒng)(CMS)平臺(tái),它是用PHP寫成的。Drupal有一個(gè)優(yōu)秀的模塊化結(jié)構(gòu),提供了許多模塊2021-08-05Drupal 開源的php內(nèi)容管理 v11.1.6
Drupal是一個(gè)開源的內(nèi)容管理系統(tǒng)(CMS) 平臺(tái),它是用PHP寫成的。主要用于構(gòu)造提供多種功能和服務(wù)的動(dòng)態(tài) 網(wǎng)站,歡飲需要的用戶下載使用2025-04-19Drupal 5.x 6.x 簡(jiǎn)體中文語(yǔ)言包[漢化補(bǔ)丁]
一個(gè)國(guó)外的BLOG,更可以說是功能強(qiáng)大的CMS,在功能設(shè)計(jì)上它仿照了phpnuke,xoops等的模塊化方式,界面上仿照了blog模式 該語(yǔ)言包借鑒了5.x漢化包中的翻譯。添加了其中沒有2009-01-15