国外设计欣赏网站 - DOOOOR.com

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,微信登陆

搜索

[Drupal教程] Drupal教程:Devel模块应用设置详解

[复制链接]
发表于 2-6-2012 21:14 | 显示全部楼层 |阅读模式
Devel模块是个大杂烩,里面包含了许多实用功能,开发者可用它来调试和检查代码的各种细节。
0 A) {* K* T: s8 v8 U* l  y% g$ K- o2 `# h+ k$ R8 t
你可以从http://drupal.org/project/devel下载该模块(或者使用CVS签出并获得更酷的效果)。安装了devel模块后,一定要启用devel区块。下面是devel区块中一些含义比较模糊的链接,这里给出了明确的解释:) V9 f/ k5 B- g# k+ h

7 ]5 b' |5 l& j% g3 ~• Empty cache(清空缓存):这个将执行includes/common.inc中的drupal_flush_all_caches()函数。这与你导航到“管理➤站点配置➤性能”点击“清除缓存数据”的效果是一样的。也就是说,CSS和JavaScript缓存被清空了;新压缩的CSS和JavaScript文件被重新命名,这样就强制客户下载新文件了;主题注册表被重新构建;菜单被重构;node_type表被更新;数据库中的缓存表,用来存储页面、菜单、节点、区块、过滤器、和变量缓存的表,也全被清空了。具体一点,清空的缓存表有cache, cache_block, cache_filter, cache_menu, 和cache_page。第3方模块的自定义缓存表,如果模块实现了hook_flush_caches()(它返回一个数组,里面包含了要被清空的缓存表的名字),那么这些缓存表也被清空。5 A+ M2 I7 V/ x% x# n8 f. A

$ N6 M) P. d/ W: n/ o! B• Enable Theme developer(启用主题开发者): 这个链接用来启用主题开发者模块,启用这个模块后,将鼠标指向一个页面元素,就会为你显示出用来生成这个页面元素的模板或主题函数了(参看第8章)。1 H& F6 m! h3 t4 p% M  k
/ q8 A) w0 F* D/ f, Y4 t9 t: a2 {
• Function reference(函数引用): 这个函数提供了一列用户函数,这些函数是在这个请求期间使用PHP的get_defined_functions()定义的。点击一个函数的名字,可以查看它的文档。
+ V* [0 s$ @+ b+ m
1 W: c( M# l* ]8 ]0 l• Hook_elements(): 这个链接使用一种便于阅读的格式来显示hook_elements()调用的结果,在使用表单API时,它会非常有用。( H1 C" u6 Z% `% w9 i* r7 X
' j6 K- y. c1 K# O8 z( }% x& U
• Rebuild menus(重构菜单): 这个调用menu_rebuild(),它将清空并重新构建menu_router表,同时更新menu_links表(参看第4章)。; L1 q+ K$ m% ^. J' e$ U4 ]6 Y4 d
  |+ }, U  k5 W% g( i  }# }; ~
• Reinstall modules(重装模块): 通过运行hook_uninstall()和hook_install()来重新安装一个模块。模式版本号将被设置成最近更新的号码。在重新安装模块以前,对于任何已有的数据库表,如果其对应模块没有实现hook_uninstall(),那么一定要手动的将其清除。
; V4 m" \! C/ l4 N1 V/ D3 o% j3 g
• Session viewer(会话查看器): 使用这个链接来显示你的$_SESSION变量的内容。
5 c2 g/ O. C6 E$ R' p6 |
7 {$ J$ `( x. N& \$ N4 I$ l" `• Variable editor(变量编辑器):这个链接列出当前存储在variables表中以及你的settings.php文件的$conf数组中的所有变量及它们的值,它还允许你对这些变量进行编辑。一般可以使用variable_get() 和 variable_set()来访问这些变量。7 n4 m. S  O* Q. `7 \8 i  U7 [
5 l6 l& ~3 Y" `# v! N
# O  V8 v: Q; ?) B! R* K
本文摘自:http://zhupou.cn。谢谢!
) `; m5 z% a& Y! C
) r3 O5 a2 r' a' n( p8 v9 r* ?2 Y! b' f( ^3 j* z. g
--------------------------------------------------------------------------------------------------------------------------------------
  ~; b* [, K2 V/ {下面内容也是相关的,合一吧:
4 u/ `6 D0 }0 _# K6 R--------------------------------------------------------------------------------------------------------------------------------------' u0 E/ [0 _6 z. O5 c6 F
$ x; t" T4 R* z% R# S: n

% m+ f$ w/ g- X2 a* ?+ o& k4 l本drupal教程主要说的是devel模块。
6 n2 C5 X& B' c" c6 d6 ?* Adevel模块是开发用的,可以显示数据库查询和页面执行的时间。
0 o% h+ Y6 v# B7 W6 p+ @2 W3 d0 h5 P
14 s6 o8 D& Q3 ^4 \" U6 u
“Collect query info ”选中以后,收集query的相关信息。
5 v! ]- z( ^& P1 V) @“Display query log”选中以后,是将上面收集query的相关信息展示出来。
7 j7 V8 w. A' d9 X( Z' g0 J所以选择的时候,最好是两个都选中,这样既看到概括收集的信息,也能看到详细的收集信息。6 O( p) j6 m6 ?, R
“Sort query log”是query的排序,by source是按照自然结果排序,by duration是按照查询时间的长短排序。* d" `; L. b  z# d2 ], |, p
“Slow query highlighting ”是把查询超过输入框数字的(比如本图的5ms)的query红色高亮显示。! Z; r, V! Z+ [5 k
“Store executed queries”是把执行的查询存贮到表里,有两个表devel_queries和devel_times。/ y( D' [5 S+ w; _  G
“Sampling interval”目前还没有搞清楚是做什么用的。
0 Z/ O1 L+ e# A) G7 ?0 j+ W
* f" B! E6 }, f) Y6 ^2
; o1 M( _- H( Q“Display page timer ”选中是为了显示页面的执行时间在log box。* k% A5 |  O0 V4 r* ~! I( {
“Display memory usage ”选中是为了显示内存用了多少。
3 }6 F  y; K. K3 q5 W: h/ z“Display redirection page”,如果一个模块执行一个drupal_goto函数的时候,query的信息可能会丢失。选中这个选项后会产生一个中间页,使得查询信息在页面跳转前完成。
+ e0 ^* u4 n4 @; [“Display form element keys and weights”选中是为了显示内存用了多少。
9 a2 l$ Z* Z' b“Error handler ”为你的网站,选择一个错误句柄。Backtrace显示一个有好的错误信息提示,上图中“SMTP library”SMTP库的显示方式。" p$ V& `  r4 b( u3 e. q6 P! N1 j

" A0 b8 g/ _: M4 Q1 T* Y# }8 u注意:
3 O4 }+ [" T6 r! O: fdevel的显示是可以控制的,需要到 管理》用户管理》访问控制 中去设置,哪个角色可以看到devel出来的信息,哪个角色不能看到。如下图所示
+ n% q; `7 m6 V" u
; a' t6 Q7 I& B8 Y9 ~; E& \, ^/ a引用一段说明
; Y9 \7 E1 p" H) T- u& B7 F& q元测试就是用来将成分分割成不同的独立单元,并决定每一单元的行为是否和期望的一样。尽管Drupal没有一个核心的单元测试API,但它拥有一个相关的学习小组(http://groups.drupal.org/unit-testing),而且它还有一些工具用来帮助开发者创建更高质量的代码。其中最著名的一个就是第3方模块——devel.module。
5 V! I; h+ ^0 o; x* M( F/ T5 M, b6 D' `1 ?- R. I
Devel模块$ \* ?+ t" Y+ B  p- w' @7 C6 K
Devel模块,最初由Moshe Weitzman编写的,它是一个大杂烩,用来帮助开发者调试和检查你的代码各个零碎的方面。4 q8 Y9 j4 _. ^

1 p: _- c3 F( h! ]( W5 a你可以从http://drupal.org/project/devel获取这个模块(或者使用CVS检出并获得更酷的效果)。安装了devel模块后,一定要启用devel区块。下面是devel区块中比较模糊的一些链接以及其能做什么的列表:
- h8 D8 k. o0 U9 I
1 q. ?3 b! P/ i• Empty Cache(清空缓存):清空数据库的用来存储页面、菜单、节点、和变量缓存的缓存表。更明确一点就是,这些要被清空的表有cache, cache_filter, cache_menu,和 cache_page。8 g% y2 F7 ^. |4 O  M, Z& _

9 M. l2 m+ x( H2 a: w  l注意 点击Empty Cache链接不能清空用户定制的缓存表。
3 c" w; ?4 J0 ^+ X5 s7 Y4 R% `6 c" [; ]
• Function reference(函数引用): 使用PHP的get_defined_functions()得到在当前请求期间所用到用户函数列表。点击一个函数的名字可以查看它的文档。
0 B5 Y& d/ r% \& @9 h' N3 N4 N
5 ]7 s; a' U0 [& ~! h( H• Reinstall module(重装模块)s: 通过运行hook_install()来重新安装一个模块。Schema版本号将被设置成最近更新的版本号。在重新安装模块以前,一定要先手工的清理掉任何存在的由该模块生成的数据库表。2 z( P4 y3 O' Z9 |* ?- M

1 s4 r0 B0 v& g• Reset menus(重置菜单):将所有的菜单项重置到它们的默认设置上,并且删除所有的定制菜单项。
2 b4 r7 Z9 [  h' K% `$ P1 f5 j: p  L3 T& p6 C
• Variable viewer(变量查看器):列出当前存储在在variables表中以及你的settings.php文件的$conf数组中的所有变量以及它们的值。一般可以使用variable_get() 和 variable_set()来访问这些变量。
; ?) c& z0 [6 A/ W0 n
. D5 [' S# [  Y9 h% M( k# X" d• Session viewer(会话查看器):展示你的$_SESSION变量的内容。
) C8 [3 l3 s" X$ N) m; l+ W1 O; a* ]5 h5 b2 q; Q2 `
展示查询
/ o/ r* i- w' _# g/ ?8 d打开页面http://example.com/?q=admin/settings/devel,选住“Collect query info”(收集查询信息) 和 “Display query log”(展示查询日志)旁的复选框。- i+ G$ E% }9 Y5 |

% V$ p) T+ {  q( ?. i' _' E一旦你保存了这些设置,你将会看到,在每个页面的最底部,都有一列查询列表,这些查询就是在生成你当前页面所用到的所有的查询!此外,列表还会告诉你生成查询的函数,该查询所耗费的时间,以及查询被调用的次数。# ]) v# l2 O6 Y  r/ J9 P5 Y
) T2 c2 `* X% r2 `7 n' ~( `/ V# w' H
在许多有见识的方式中你都可以使用这一信息。例如,如果同一查询在一个页面被调用了40次,那么你就需要检查一下你的代码看是否存在一个坏的循环结构体。如果确实是这样的话,你可以考虑实现一个静态变量,在请求期间,来保存数据库插叙结果。下面的例子说明了这个设计模式的样子(来自taxonomy.module):* |6 p* X7 K9 K* o& Z" \% l
- B7 d! `6 [' l/ [6 {) Z
function taxonomy_get_term($tid) {& D' |: H- u0 n- [7 @
static $terms = array();
- R% f; {9 |$ m+ G% Bif (!isset($terms[$tid])) {+ T% I$ Q2 h' A7 |& H1 r% g2 q
$terms[$tid] = db_fetch_object(db_query('SELECT * FROM {term_data} WHERE tid =4 ?( S+ n$ I0 U/ w0 \  n) L0 L" p
%d', $tid));& s! z! N7 {* s6 u  S. l  T# d
}( E0 ~$ Z* T' a7 u
return $terms[$tid];8 A# c: m- N1 d1 j! d0 x
}% g9 s" F8 o5 K' N1 J( H

' _, b! l! E0 {  t, k0 q我们创建了一个静态数组来保存结果集,这样如果查询已被执行过了,那么我们就已经有了这个值,这样就可以直接将其返回而不是再次查询数据库了。
5 f& B; i  {: F7 |# G, i  X  T1 O
8 ^# M# X7 f4 W  A! W) P- S/ v; d处理耗费时间的查询4 d9 R% P) A& ?* }
假定你已经编写了一个名为task(任务)的定制节点模块,而且你使用hook_load()来向节点对象追加关于任务的额外信息。表的schema如下:
! h. ?, p) F+ o3 q! N7 fCREATE TABLE task (# P* K2 }; ?$ n" D$ ]' ?
nid int,% ?0 d) p' w  a$ `. q5 Q0 N
vid int,1 `, A$ g( T( F9 ~" t( p* n
percent_done int,& j/ C3 r4 [( a+ h4 v( D# q
PRIMARY KEY (nid,vid),
- k# f! I" i1 C2 MKEY nid (nid)
6 B1 R/ X9 t) _* K; ]3 O% Y; H);3 Z- M6 S- O) B

2 |: T# N3 X8 E/ D6 l5 v- W9 e. Y3 X在运行了devel.module和查看了查询日志以后,你注意到针对上表的查询拖累你的站点性能!注意超过5毫秒的查询就被默认是缓慢的。* A0 c9 Y; h; H5 l$ |- |

% _+ `0 }- E7 O  R% {2 J1 g毫秒          函数              查询
" {0 Y4 W  h# j& o. E' `9 |27.16          task_load         SELECT * FROM task WHERE vid = 3) k0 T& @+ ]$ N2 M: Z$ d' V

" ^& }1 m7 Y) J* K& `  w) J! H那么为什么这个查询这么耗时呢?如果它是一个使用多表关联的更复杂的查询,那么我们将考虑使用更好的方式来组织数据,但是它是一个非常简单的查询。首先要做的是使用SQL的EXPLAIN语法来查看数据库是怎么解释这个查询的。当你在一个SELECT语句前面追加一个关键字EXPLAIN时,数据库将返回该查询执行计划的相关信息。" h0 X8 q8 T. v3 }" w

- x- d9 ]0 \5 i( O5 ~" xEXPLAIN SELECT * FROM task WHERE vid = 3; |- Z. I* P, v1 l9 B
MySQL给出下面的报告:  a  O! l/ ~8 `0 y/ e# G1 H  U
2 r- E8 l6 w/ c
Id select_type table  type    possible_keys key  key_len  ref  rows  Extra2 C; }, E  x0 B, k! B  F
1  SIMPLE      task    system      NULL      NULL NULL     NULL  1
8 M, t- V) x! }' M: O
/ Z& b- T# n! w0 U/ L1 p! K在这里最重要的一列就是key列,它现在的值为NULL。这告诉我们MySQL在获取结果集时没有使用任何的主键、UNIQUE键、或者索引键;它需要一行一行的查找。所以加快这个查询速度的最好方式是向vid列添加一个UNIQUE键。, n% k; ?0 q5 y. p7 d' {
4 `9 q5 y/ k$ t3 g, C7 j
ALTER TABLE task ADD UNIQUE (vid);$ @# L8 M& O: r9 V

  J7 X; x( v' d- E/ V更多关于MySQL的EXPLAIN信息,参看http://dev.mysql.com/doc/refman/5.0/en/explain.html/ [) a- W: z  J. v& Y6 A& w1 C
( y1 `: m" ^1 U0 D; |
Devel模块的其它用途
  N- s4 T$ `1 S" N1 h  sDevel模块还有一些其它一些方便函数,它们常被忽略却能增加你的开发效率的。9 y# B8 K+ Z  j% }8 G" o) w
4 ?, c; j  d6 q) e
例如,你可以实时的切换当前查看Drupal页面的用户。这对于技术支持和调试其它角色非常有用。为了切换到另一个用户上,导航到URL http://example.com/?q=devel/switch/$uid,其中$uid是你想切换到的用户的ID。另一种方式是,启用“Switch users”(切换用户)区块,它提供了达到相同功能的一组链接。; }: ^  s' h. R+ j1 o9 D4 F( `

# I* ~  A! m7 ]/ q9 A你可以使用dsm(), dvm(),dpr(),和 dvr()函数来输出调试信息,这些信息对于其它用户是不可见的。
- m8 N9 {5 k6 e& p• dsm() 向页面的消息区域输出一个简单变量(比如,一个字符串或者一个整数。)0 |! R1 j/ w. ?9 b) l. x: A
• dvm()向页面的消息区域输出一个var_dump()。对于复杂的变量比如数组或者对象使用这个函数。9 q% @' n# o) [  q
• dpr() 使用一个递归函数在页面顶部输出一个复杂的变量(比如一个数组或者对象)。
: J# V% _, z2 F6 ]# R1 f5 q. G5 Y• dvr()在页面顶部输出一个var_dump()。" J( }' I; j9 B

( ^. ]- ]: i  n8 T2 I这些函数的输出对于没有“access devel information”(“访问devel信息”)权限的用户是不可见的,这对于实时调试非常方便。! N' k% Q0 x9 g  r
7 Q  {# i/ A9 S: P7 c$ e/ R8 {
一个使用的例子如下所示:
3 r' t, f( m+ u# L/ B) A% A6 V* w0 ^dpr(node_load(5)); // Display the data structure of node 5.7 O7 N+ o7 [, [, g% c
dvr($user); // Display the $user variable.& C: H; E% Q8 E
本部分摘自:http://www.5iphp.com/drupal-devel ,谢谢!
6 P* w+ }5 a1 k# e; d% q7 F4 j" ?$ M& s7 d4 @0 d

3 i7 K; r  _. U! B

|2011-2026-版权声明|平台(网站)公约|手机版|手机版|DOOOOR 设计网 ( 吉ICP备2022003869号 )

GMT+8, 12-19-2025 04:07 , Processed in 0.074716 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表