一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Devel模塊使用技巧

 sslit 2012-01-13

Drupal調(diào)試之Devel模塊使用技巧

在Drupal開發(fā)中,必然會(huì)遇到需要代碼調(diào)試的時(shí)候,這時(shí)候有人可能會(huì)想說用xdebug之類的調(diào) 試工具,但有的時(shí)候你只是想得到一些中間值或者Drupal流程中的一些統(tǒng)計(jì)值,抑或是某個(gè)函數(shù)的輸出,使用xdebug顯然就顯得不那么合適了。在眾多 調(diào)試工具當(dāng)中,Devel是其中必備的一個(gè),其他各種調(diào)試工具,將會(huì)在后續(xù)文章中一一闡述。

Devel模塊作為Drupal的一個(gè)調(diào)試模塊有其天然優(yōu)勢(shì),首先他使用Drupal的機(jī)制開發(fā),所以輸出信息可以和Drupal很好的整合,另外 Devel模塊中可以直接調(diào)用Drupal的API函數(shù),并且隨著社區(qū)的貢獻(xiàn),以及Drupal版本的更新,Devel也會(huì)因開源的特質(zhì)越來越貼近開發(fā)者 的實(shí)際需要,另外Devel模塊在drupal性能優(yōu)化方面也表現(xiàn)不凡,比如SQL查詢時(shí)間統(tǒng)計(jì)、整合xhprof模塊的性能優(yōu)化(xhprof的使用會(huì)后續(xù)寫相關(guān)文章討論),因此Devel模塊是Drupaler們的必備工具。

相信每一個(gè)Drupaler都知道Devel模塊,(Devel模塊的的官方地址是 http://www./project/devel),并且在自己的項(xiàng)目中使用他,所以本文不打算流水帳一樣講述所有Devel的特性,而是從中挑出幾個(gè)或巧妙或不顯而易見的一些用法。

1. devel/php (頁面)

比如:http://www./devel/php

這是一個(gè)執(zhí)行PHP代碼的Drupal path,對(duì)生產(chǎn)服務(wù)器來說,這是危險(xiǎn)的,但對(duì)程序員調(diào)試來說是非常有用的。

最簡(jiǎn)單的,我可以在里面查看任何變量或者函數(shù)返回值。

//dpm是devel提供的一個(gè)代替var_dump/drupal_set_message的函數(shù),是打印調(diào)試信息的利器,請(qǐng)查閱官方介紹
dpm(user_load(1));

但更重要的是我可以用來調(diào)試,比如有只有生產(chǎn)服務(wù)器才存在無法在本地重現(xiàn)的BUG,我一般就是臨時(shí)開啟Debug模塊,然后對(duì)大概有問題的函數(shù)使用 此頁面調(diào)試,我可以通過函數(shù)返回值來定位,如果定位到另外一個(gè)函數(shù),就構(gòu)造輸入去那個(gè)函數(shù)里繼續(xù)檢查輸出,這樣可以在不打斷服務(wù)器運(yùn)行的情況下,做代碼跟 蹤調(diào)試,有時(shí)可以很快的找到問題所在。

2. devel/switch/登錄名 (頁面)

比如: http://www./devel/switch/user-a

有時(shí)某些BUG是只有某個(gè)用戶才會(huì)看到的,這是我們需要那個(gè)賬戶的登錄信息,但密碼顯然我們是不容易得到的,這時(shí)我們可以用這個(gè)功能來切換到這個(gè)用 戶的登錄狀態(tài),devel還封裝了切換用戶的block,但更常見的情況是使用這個(gè)鏈接,后面加用戶登錄名,快速切換到那個(gè)賬戶,以那個(gè)用戶的身份去觀察 BUG。

如果你觀察這個(gè)hook_menu的代碼實(shí)現(xiàn),你會(huì)發(fā)現(xiàn)一個(gè)很有意思的核心函數(shù)devel_switch_user,他是切換用戶功能的主要函數(shù),邏輯也很簡(jiǎn)單,但這個(gè)函數(shù)隱藏了一個(gè)切換回來的功能,這個(gè)功能只能在代碼中才能用到,因?yàn)樵加脩粜畔⑹谴嬖陟o態(tài)變量里的。

devel_switch_user('tom'); // 切換成用戶tom
 
// 做一些操作
 
devel_switch_user(); // 切換回來

如果沒有這個(gè)函數(shù),我們會(huì)這么寫,比較一下就會(huì)發(fā)現(xiàn)devel模塊的寫法更簡(jiǎn)潔。

global $user;
$old_user = $user;
$user = user_load(array('name' => 'tom'));
 
// 做一些操作
$user = $old_user;

3. dd(函數(shù))

有時(shí)候當(dāng)你在調(diào)試一些功能時(shí)dpm是沒有那么好用的,比如調(diào)試batch或者沒有界面的drupal腳本,我們需要一種新的方式幫助我們調(diào)試,dd 函數(shù)會(huì)在這種情況下發(fā)揮作用,dd函數(shù)的全稱是devel_debug, 看代碼實(shí)現(xiàn)就會(huì)發(fā)現(xiàn)他將信息輸出到一個(gè)文件里,之后我們可以通過那個(gè)文件查看調(diào)試信息,這樣我們就可以通過linux的tail命令實(shí)時(shí)查看調(diào)試信息了。

$test = "this is my test";
dd($test, $label = NULL);

dd函數(shù)會(huì)在網(wǎng)站服務(wù)器的臨時(shí)目錄(drupal的文件系統(tǒng)設(shè)置或者/tmp目錄下)產(chǎn)生一個(gè)名為 drupal_debug.txt的文件,可以在服務(wù)器上查看相應(yīng)的輸出。

這個(gè)命令的缺點(diǎn)在于調(diào)試信息的輸出文件的位置和名稱是寫死在代碼中的,未來最好可以傳參定義或者配置。

4. devel/source?file=Drupal的相對(duì)路徑 (頁面)

這個(gè)URL是用來查看源代碼的,這個(gè)功能在某些情況下也會(huì)用到,比如生產(chǎn)服務(wù)器出現(xiàn)BUG,你想快速check代碼,使用ssh登陸,切換路徑,然 后來回切換文件查看就不如直接在瀏覽器里訪問方便,前提是你要足夠熟悉Drupal的文件結(jié)構(gòu)以及你自己項(xiàng)目的文件結(jié)構(gòu)。當(dāng)然出于這個(gè)目的,這個(gè)功能還有 點(diǎn)簡(jiǎn)單,應(yīng)該可以做一下簡(jiǎn)單的文件瀏覽器。

5. SQL調(diào)試

Devel在數(shù)據(jù)庫查詢的SQL這方面做了一定的努力,比如后臺(tái)可以開啟sql log,并顯示在頁面最下方,可以按照觸發(fā)順序或者執(zhí)行時(shí)間順序排序顯示等等。但是一旦開啟了sql log,我們就不得不log所有的sql, 這樣查看自己想要看的那個(gè)sql就不是那么方便了。

其實(shí)devel模塊還提供了一個(gè)調(diào)試方法,就是db_queryd函數(shù),就是把我們常用的db_query后面加一個(gè)d,在執(zhí)行效果不變的前提下, 還會(huì)print出執(zhí)行的sql.這個(gè)方法比上面的方法簡(jiǎn)潔了一些,但問題是在頁面上print往往不是個(gè)好主意,而且你要調(diào)試的sql很有可能是被某個(gè)第 三方API在執(zhí)行,比如$view->query(),所以我們還要想想有沒有別的辦法,通過閱讀db_query的代碼,以及devel的代碼, 我發(fā)現(xiàn)還有一種方法。

global $conf, $queries;
$conf['dev_query'] = 1; //臨時(shí)開啟sql log
 
db_query(); //可以是任意長(zhǎng)度的包含sql執(zhí)行的代碼,或者第三方模塊的操作數(shù)據(jù)的API。
$conf['dev_query'] = 0; //關(guān)閉sql log
dpm($queries); // 顯示sql

$queries是一個(gè)全局變量,用于存儲(chǔ)sql log, 只有dev_query開啟才會(huì)記錄log,這里假設(shè)默認(rèn)是關(guān)閉的,因?yàn)槲覀冎幌肟次覀冴P(guān)心的sql。這里沒有用variable_get喝 variable_set是因?yàn)関ariable_set會(huì)觸發(fā)清緩存操作,性能不好。

如果覺得寫起來麻煩,可以考慮封裝成函數(shù),比如devel_query_start(); devel_query_end();

最后,Devel模塊提供給我們很多查看信息的頁面,有時(shí)候我們確實(shí)需要這些頁面查看一些信息,最簡(jiǎn)單的devel/phpinfo可以查看php 的安裝信息,我們不需要自己再去創(chuàng)建包含phpinfo()的文件來查看了。Devel模塊還提供了一些子模塊,還有一些第三方模塊與devel模塊配合 使用,這些話題我將另起一篇文章和大家分享。

希望本文中分享的技巧能對(duì)各位Drupaler的工作有所幫助。


聲明: 本站所有文章歡迎轉(zhuǎn)載,所有文章未說明,均屬于原創(chuàng),轉(zhuǎn)載均請(qǐng)注明出處。
本文有效鏈接: http://www./2011/12/how-to-use-devel/
版權(quán)所有: Drupal與高性能網(wǎng)站架構(gòu) http://www.

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    日本丁香婷婷欧美激情| 欧美欧美日韩综合一区| 精品一区二区三区不卡少妇av| 东京热加勒比一区二区| 中文字幕在线区中文色| 日韩精品中文字幕亚洲| 高清一区二区三区大伊香蕉| 日本二区三区在线播放| 中文字幕高清免费日韩视频| 色丁香之五月婷婷开心| 国产精品一区二区传媒蜜臀| 狠狠亚洲丁香综合久久| 亚洲欧美日韩国产综合在线| 国产日本欧美特黄在线观看| 国产爆操白丝美女在线观看| 九九热精品视频在线观看| 日韩精品一区二区亚洲| 深夜福利亚洲高清性感| 欧美日韩精品综合一区| 婷婷九月在线中文字幕| 国产精品美女午夜视频| 国产女同精品一区二区| 麻豆果冻传媒一二三区| 黄色美女日本的美女日人| 精品丝袜一区二区三区性色| 欧美大黄片在线免费观看| 美女被啪的视频在线观看| 熟女免费视频一区二区| 欧美亚洲另类久久久精品| 国产精品免费福利在线| 欧美日韩亚洲精品内裤| 日韩综合国产欧美一区| 国产精品成人又粗又长又爽| 国产成人人人97超碰熟女| 亚洲国产天堂av成人在线播放| 欧美日韩黑人免费观看| 精品一区二区三区不卡少妇av| 扒开腿狂躁女人爽出白浆av| 国产一级二级三级观看| 国产免费一区二区三区av大片| 欧美国产日本高清在线|