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

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,微信登陆

搜索

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

[复制链接]
发表于 2-6-2012 21:14 | 显示全部楼层 |阅读模式
Devel模块是个大杂烩,里面包含了许多实用功能,开发者可用它来调试和检查代码的各种细节。) n6 X. m. ]$ O. o+ ~) _) _6 }: e

8 P$ e/ b) E- K# B- H5 @ 你可以从http://drupal.org/project/devel下载该模块(或者使用CVS签出并获得更酷的效果)。安装了devel模块后,一定要启用devel区块。下面是devel区块中一些含义比较模糊的链接,这里给出了明确的解释:
" E8 Q, L; W  N$ v. O/ i$ g9 x8 U- H! r8 E% g3 E
• 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()(它返回一个数组,里面包含了要被清空的缓存表的名字),那么这些缓存表也被清空。
- O3 u3 T8 P" u2 [( \+ |! t
* b/ }) Y5 L8 o9 e+ p% D• Enable Theme developer(启用主题开发者): 这个链接用来启用主题开发者模块,启用这个模块后,将鼠标指向一个页面元素,就会为你显示出用来生成这个页面元素的模板或主题函数了(参看第8章)。7 K1 F8 s' i2 d2 U5 c- ~
+ L" I5 R3 m5 G/ t! _
• Function reference(函数引用): 这个函数提供了一列用户函数,这些函数是在这个请求期间使用PHP的get_defined_functions()定义的。点击一个函数的名字,可以查看它的文档。
$ v2 G! t0 C' q, h$ b8 e
& L0 x, P% k1 O4 A( Q2 I; X7 d- S• Hook_elements(): 这个链接使用一种便于阅读的格式来显示hook_elements()调用的结果,在使用表单API时,它会非常有用。* z0 p: J0 T) H3 }) d+ k
5 t! e5 r4 p0 ~) u% p5 Y
• Rebuild menus(重构菜单): 这个调用menu_rebuild(),它将清空并重新构建menu_router表,同时更新menu_links表(参看第4章)。
" E% S0 B, ^$ e
+ }3 `7 O+ }2 @• Reinstall modules(重装模块): 通过运行hook_uninstall()和hook_install()来重新安装一个模块。模式版本号将被设置成最近更新的号码。在重新安装模块以前,对于任何已有的数据库表,如果其对应模块没有实现hook_uninstall(),那么一定要手动的将其清除。
, p! r+ A/ O% w4 z5 L  l. f1 i5 x/ k  B% ]  F  ?
• Session viewer(会话查看器): 使用这个链接来显示你的$_SESSION变量的内容。5 y5 [5 |" I6 q2 z( D0 B
# F, U: q5 [1 s9 Y
• Variable editor(变量编辑器):这个链接列出当前存储在variables表中以及你的settings.php文件的$conf数组中的所有变量及它们的值,它还允许你对这些变量进行编辑。一般可以使用variable_get() 和 variable_set()来访问这些变量。
( Z' ]: B: p/ p+ \9 e4 ^/ V$ O
* m0 d% V3 y! @( g, J& l
本文摘自:http://zhupou.cn。谢谢!" `8 K7 A  z+ X6 f; S
. R6 h% o# ^* S; z2 k
& A( N3 y  J; }
--------------------------------------------------------------------------------------------------------------------------------------9 w$ [9 Q. ?- Z6 Z
下面内容也是相关的,合一吧:/ h  p# [( ]/ p% \, X3 E/ P+ l" P
--------------------------------------------------------------------------------------------------------------------------------------
! a& u3 b1 f9 @' X! E1 R
% ]* P1 r7 [9 }
* L; }4 v  A( D* q& M+ |2 R4 m本drupal教程主要说的是devel模块。% G' p8 r: Y3 ?
devel模块是开发用的,可以显示数据库查询和页面执行的时间。! a  @5 h  j- R5 @# `: A, E

0 x, }" u! @  z3 |16 k" u: o0 Y! I- L- i) R. u8 o
“Collect query info ”选中以后,收集query的相关信息。& g7 G+ G1 I9 X6 v8 K7 X
“Display query log”选中以后,是将上面收集query的相关信息展示出来。
+ r+ \2 ?" ]! W所以选择的时候,最好是两个都选中,这样既看到概括收集的信息,也能看到详细的收集信息。
) o5 k, p  g- S$ L8 T  [) s. z% y“Sort query log”是query的排序,by source是按照自然结果排序,by duration是按照查询时间的长短排序。
+ U" z. K6 _/ o7 H5 ?; f& U) p“Slow query highlighting ”是把查询超过输入框数字的(比如本图的5ms)的query红色高亮显示。' y# ]6 N0 Q' \
“Store executed queries”是把执行的查询存贮到表里,有两个表devel_queries和devel_times。
2 U) w9 J: P" B3 S& Y$ {4 X' b/ w* c“Sampling interval”目前还没有搞清楚是做什么用的。
" I$ U: ?  k5 d% s- E* h8 `! @3 v7 t+ r' Q. @' S# b1 [
2
( x7 q+ f! \& o6 P3 ~  X1 \1 ^“Display page timer ”选中是为了显示页面的执行时间在log box。
0 s- ~! g' O7 w9 n! k" S) B“Display memory usage ”选中是为了显示内存用了多少。
/ ?, ^2 c# q( k: a4 z- P“Display redirection page”,如果一个模块执行一个drupal_goto函数的时候,query的信息可能会丢失。选中这个选项后会产生一个中间页,使得查询信息在页面跳转前完成。
$ y4 a& ?) W# n0 W“Display form element keys and weights”选中是为了显示内存用了多少。$ ^8 j' y3 D2 e1 O8 f, ]
“Error handler ”为你的网站,选择一个错误句柄。Backtrace显示一个有好的错误信息提示,上图中“SMTP library”SMTP库的显示方式。$ V9 H1 z& M1 Q8 _6 _# ]* q

/ ~: a+ P2 P. N注意:
/ J) x' j& i; i' P8 fdevel的显示是可以控制的,需要到 管理》用户管理》访问控制 中去设置,哪个角色可以看到devel出来的信息,哪个角色不能看到。如下图所示
; G3 ~1 o$ c  V# y/ N3 F5 G8 T
# g3 t/ m4 D( m% s! q引用一段说明
! ~- L1 j! I$ B+ H5 w元测试就是用来将成分分割成不同的独立单元,并决定每一单元的行为是否和期望的一样。尽管Drupal没有一个核心的单元测试API,但它拥有一个相关的学习小组(http://groups.drupal.org/unit-testing),而且它还有一些工具用来帮助开发者创建更高质量的代码。其中最著名的一个就是第3方模块——devel.module。; ?5 @  v! m' c% W0 T( I& b; Z" v/ `
4 a+ x2 J7 W+ G8 H6 b
Devel模块
! W9 p: T- k/ `" V+ RDevel模块,最初由Moshe Weitzman编写的,它是一个大杂烩,用来帮助开发者调试和检查你的代码各个零碎的方面。' _, ]" c) |, ^! g7 L5 |/ [
" X& ?* ^& F: R* [/ a
你可以从http://drupal.org/project/devel获取这个模块(或者使用CVS检出并获得更酷的效果)。安装了devel模块后,一定要启用devel区块。下面是devel区块中比较模糊的一些链接以及其能做什么的列表:; f. l1 ~( Y5 `# Y8 @( `, f" c; }
) w8 ?! d1 A# [( ?$ a( b
• Empty Cache(清空缓存):清空数据库的用来存储页面、菜单、节点、和变量缓存的缓存表。更明确一点就是,这些要被清空的表有cache, cache_filter, cache_menu,和 cache_page。
- S8 W* r+ y0 F, K$ K6 H/ _2 f7 Y( f
' K4 `  M* D! w' e注意 点击Empty Cache链接不能清空用户定制的缓存表。
3 o2 r$ d5 Q* a7 D7 e
: v& R% L1 h" y" y• Function reference(函数引用): 使用PHP的get_defined_functions()得到在当前请求期间所用到用户函数列表。点击一个函数的名字可以查看它的文档。& O1 w% ~, D+ t! i# }, O) I; \3 N
5 M8 X2 ~- N3 ~  j5 t0 o# A
• Reinstall module(重装模块)s: 通过运行hook_install()来重新安装一个模块。Schema版本号将被设置成最近更新的版本号。在重新安装模块以前,一定要先手工的清理掉任何存在的由该模块生成的数据库表。
* X6 u, Y& \9 I+ {4 T7 E! n! f1 q$ `# y9 r: B
• Reset menus(重置菜单):将所有的菜单项重置到它们的默认设置上,并且删除所有的定制菜单项。
9 Z1 y" j! N9 p# s
9 |3 g" Q+ r2 h8 @1 l# I• Variable viewer(变量查看器):列出当前存储在在variables表中以及你的settings.php文件的$conf数组中的所有变量以及它们的值。一般可以使用variable_get() 和 variable_set()来访问这些变量。
) B  s% n4 y" I1 s3 x5 ~* q4 W* s! c+ u# K+ U% |0 c! r" H
• Session viewer(会话查看器):展示你的$_SESSION变量的内容。& K( f" o3 E1 Y& Q  F& \
7 z' I8 R& j4 R% b$ T
展示查询
; T' n* R3 {6 w3 [- F/ x打开页面http://example.com/?q=admin/settings/devel,选住“Collect query info”(收集查询信息) 和 “Display query log”(展示查询日志)旁的复选框。
8 t$ R; t" f1 G0 t6 Y8 G) z  X! y1 s" R( {* ]
一旦你保存了这些设置,你将会看到,在每个页面的最底部,都有一列查询列表,这些查询就是在生成你当前页面所用到的所有的查询!此外,列表还会告诉你生成查询的函数,该查询所耗费的时间,以及查询被调用的次数。
1 g0 l+ k* x# U
# |3 d: Z; {' R7 U+ d, a在许多有见识的方式中你都可以使用这一信息。例如,如果同一查询在一个页面被调用了40次,那么你就需要检查一下你的代码看是否存在一个坏的循环结构体。如果确实是这样的话,你可以考虑实现一个静态变量,在请求期间,来保存数据库插叙结果。下面的例子说明了这个设计模式的样子(来自taxonomy.module):. ~6 B' O5 |* F" o* V1 B) T
5 m% j7 F. m; N
function taxonomy_get_term($tid) {, r: w5 R( Z% @% `" I& S8 r( i
static $terms = array();2 b! d/ L6 L" z' K9 D
if (!isset($terms[$tid])) {
# s; s! s+ [2 b3 r# z2 N$terms[$tid] = db_fetch_object(db_query('SELECT * FROM {term_data} WHERE tid =- ~+ ?' v6 h! a& g: }" C3 Q0 b
%d', $tid));0 \: e! i2 N* F  l, g2 Q
}6 W. s  U, f( |, m! \5 ~
return $terms[$tid];) ?6 ~/ V  p' b  x& m+ a
}
; h: N! W1 f( i0 W9 {- W% t: r3 ?: L6 W, z. x
我们创建了一个静态数组来保存结果集,这样如果查询已被执行过了,那么我们就已经有了这个值,这样就可以直接将其返回而不是再次查询数据库了。2 y7 K  T7 _1 T* Z$ l3 M

/ M* b4 @7 t9 p- U8 g" v! a处理耗费时间的查询
" g4 T, ]" i2 H' k假定你已经编写了一个名为task(任务)的定制节点模块,而且你使用hook_load()来向节点对象追加关于任务的额外信息。表的schema如下:+ l# V$ D! j1 ~7 E: w6 R+ m; J, ?
CREATE TABLE task (0 y; Z5 q0 y, i& O; W
nid int,& u! w4 v% G: y( q* x& q; {0 B
vid int,, Z2 M  l; l- H+ Q; V
percent_done int,& t* _9 U: Y( ]6 v' p. h9 V
PRIMARY KEY (nid,vid),* W3 ~" r" C% D5 f
KEY nid (nid)- r4 F5 h) D0 Y5 v/ ]; r! E8 Y. V
);, p/ a4 E6 _* x+ Q' n: Y
8 J4 P3 O; y9 \8 j( [
在运行了devel.module和查看了查询日志以后,你注意到针对上表的查询拖累你的站点性能!注意超过5毫秒的查询就被默认是缓慢的。
! W, H+ I- d% A+ S) q( t$ ]( e: a: K8 o& Q# M" G+ a# Q# O4 a
毫秒          函数              查询" S/ l2 b9 X5 x8 j1 a; q
27.16          task_load         SELECT * FROM task WHERE vid = 3
: R! N' T6 X- Q! V
- f5 Y8 z5 J; k4 T那么为什么这个查询这么耗时呢?如果它是一个使用多表关联的更复杂的查询,那么我们将考虑使用更好的方式来组织数据,但是它是一个非常简单的查询。首先要做的是使用SQL的EXPLAIN语法来查看数据库是怎么解释这个查询的。当你在一个SELECT语句前面追加一个关键字EXPLAIN时,数据库将返回该查询执行计划的相关信息。( ~' }) ]8 ]6 D; r; A9 y9 @
( E# p$ P) J- s
EXPLAIN SELECT * FROM task WHERE vid = 3
/ D- X# r' y% N: h+ Y9 t  jMySQL给出下面的报告:. W7 V  R* M" X2 c2 i1 C- g

) f7 ~. |5 Y8 F: ?Id select_type table  type    possible_keys key  key_len  ref  rows  Extra
" O. \5 n% m+ j0 M1  SIMPLE      task    system      NULL      NULL NULL     NULL  1. m8 r+ J6 X4 Z( Z

  Q  }2 _* p* |  ]5 E0 c, _在这里最重要的一列就是key列,它现在的值为NULL。这告诉我们MySQL在获取结果集时没有使用任何的主键、UNIQUE键、或者索引键;它需要一行一行的查找。所以加快这个查询速度的最好方式是向vid列添加一个UNIQUE键。/ A- [5 ?. ]% B7 Y; |$ Q
. [% |$ G5 O! k4 ~3 Y6 w1 v
ALTER TABLE task ADD UNIQUE (vid);5 I' a- o# C# `' w+ M1 F
. c3 W- g0 M+ i+ a) X! ]9 U2 ?
更多关于MySQL的EXPLAIN信息,参看http://dev.mysql.com/doc/refman/5.0/en/explain.html1 F8 k  Y3 u/ K" C5 n
# O- J5 o! P% O! J7 ~" V" l
Devel模块的其它用途# z- e- b" @" N; ^0 m; O
Devel模块还有一些其它一些方便函数,它们常被忽略却能增加你的开发效率的。  S/ I6 ^" o/ _

$ q& {9 R" d& d* q9 y3 v* y, i例如,你可以实时的切换当前查看Drupal页面的用户。这对于技术支持和调试其它角色非常有用。为了切换到另一个用户上,导航到URL http://example.com/?q=devel/switch/$uid,其中$uid是你想切换到的用户的ID。另一种方式是,启用“Switch users”(切换用户)区块,它提供了达到相同功能的一组链接。
' s9 H9 v" n( D8 s( W% q, T" C! Y1 K% T( y3 v0 `
你可以使用dsm(), dvm(),dpr(),和 dvr()函数来输出调试信息,这些信息对于其它用户是不可见的。
* ?6 ]$ |, D6 |  G( V• dsm() 向页面的消息区域输出一个简单变量(比如,一个字符串或者一个整数。)
; [: x0 V! |' Q• dvm()向页面的消息区域输出一个var_dump()。对于复杂的变量比如数组或者对象使用这个函数。
) [9 W, T/ U4 Y2 r, J7 U• dpr() 使用一个递归函数在页面顶部输出一个复杂的变量(比如一个数组或者对象)。
* K; B% t% |0 T! }2 b• dvr()在页面顶部输出一个var_dump()。0 ^6 G. ]% P# {# w  F

: s$ O4 b% O8 c( a这些函数的输出对于没有“access devel information”(“访问devel信息”)权限的用户是不可见的,这对于实时调试非常方便。
1 X7 ^; ?. Z8 |( g8 D% ^+ r7 s6 Z  _7 q% Y# J8 Z, c
一个使用的例子如下所示:
3 [/ ~$ g0 P) }0 Q- ^* G  Ydpr(node_load(5)); // Display the data structure of node 5.
6 W  d  F3 `. o5 Udvr($user); // Display the $user variable.
/ f' ]$ x: Y8 W2 ^6 y/ d本部分摘自:http://www.5iphp.com/drupal-devel ,谢谢!
, L% x: W& ^# w: P! W
1 V" E- V  t+ o9 E4 D) r) y9 k. N6 o+ Y% E( |* Q6 r! J

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

GMT+8, 5-1-2025 11:05 , Processed in 0.569144 second(s), 389 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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