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

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,微信登陆

搜索

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

[复制链接]
发表于 2-6-2012 21:14 | 显示全部楼层 |阅读模式
Devel模块是个大杂烩,里面包含了许多实用功能,开发者可用它来调试和检查代码的各种细节。0 S6 D0 d% X. W+ W5 p

; s5 O& W7 ^5 C0 H 你可以从http://drupal.org/project/devel下载该模块(或者使用CVS签出并获得更酷的效果)。安装了devel模块后,一定要启用devel区块。下面是devel区块中一些含义比较模糊的链接,这里给出了明确的解释:
# }0 `) j/ p' {/ O; ^, P2 `
2 B# e1 s$ x  G1 ]3 L' A3 {• 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()(它返回一个数组,里面包含了要被清空的缓存表的名字),那么这些缓存表也被清空。7 P! R0 r- w, M/ h$ Z( X' g

' \. Z) N. A! W* O: x$ R- J• Enable Theme developer(启用主题开发者): 这个链接用来启用主题开发者模块,启用这个模块后,将鼠标指向一个页面元素,就会为你显示出用来生成这个页面元素的模板或主题函数了(参看第8章)。
  i$ k; [' ]7 \% X' m+ ^4 ]1 g1 @8 n- D% v: \' N
• Function reference(函数引用): 这个函数提供了一列用户函数,这些函数是在这个请求期间使用PHP的get_defined_functions()定义的。点击一个函数的名字,可以查看它的文档。1 ^, `% M# Y3 B0 [* p) l8 Z

3 a0 ?8 v5 t9 @! t8 C/ ?- J! l2 @• Hook_elements(): 这个链接使用一种便于阅读的格式来显示hook_elements()调用的结果,在使用表单API时,它会非常有用。
7 k4 }, W$ p3 H) G9 d2 l# L4 d& ]4 i$ B/ k
• Rebuild menus(重构菜单): 这个调用menu_rebuild(),它将清空并重新构建menu_router表,同时更新menu_links表(参看第4章)。" V) j1 L$ Z( X! h8 T+ v

* |3 T2 V( H0 _  e! \• Reinstall modules(重装模块): 通过运行hook_uninstall()和hook_install()来重新安装一个模块。模式版本号将被设置成最近更新的号码。在重新安装模块以前,对于任何已有的数据库表,如果其对应模块没有实现hook_uninstall(),那么一定要手动的将其清除。* S' k$ O6 N( G2 @# \1 W# @
2 c2 _' |3 L+ F3 o
• Session viewer(会话查看器): 使用这个链接来显示你的$_SESSION变量的内容。/ W" u: j& |9 j) c5 `' t
$ H1 S& h- R0 F3 \2 }2 H1 u# j
• Variable editor(变量编辑器):这个链接列出当前存储在variables表中以及你的settings.php文件的$conf数组中的所有变量及它们的值,它还允许你对这些变量进行编辑。一般可以使用variable_get() 和 variable_set()来访问这些变量。0 U& |* [7 X3 e$ v2 [) `- E# T

' k2 ]5 e0 D6 n9 `
/ \5 N# }' k* v, u7 @+ y' Z0 E0 X本文摘自:http://zhupou.cn。谢谢!  O' O( U8 y9 A0 T* C4 b* ^

9 n: l+ u0 _3 f+ ~( s/ P' d
* ]% x% y3 l# s--------------------------------------------------------------------------------------------------------------------------------------
' o7 Y5 X, B/ Q$ O, h: N/ l3 @- Z6 \! C下面内容也是相关的,合一吧:( H. b1 z# }1 ]: K0 l
--------------------------------------------------------------------------------------------------------------------------------------
2 q. l! d( |+ c# }' q
- E' e# f' ^, ?7 r# t& H' i$ W, ?" d; s; q: ]! I3 k
本drupal教程主要说的是devel模块。( r. |4 G( c& C3 R& Y
devel模块是开发用的,可以显示数据库查询和页面执行的时间。
1 R% n- `( D+ R4 X$ W% p. D
5 O& O/ O( n' L- g  c  B0 w+ B1+ L9 h1 Z/ ^' W; n# b, Z! |
“Collect query info ”选中以后,收集query的相关信息。; I0 z* R8 u& s5 Y! h4 y' N
“Display query log”选中以后,是将上面收集query的相关信息展示出来。" B" Y5 j9 e7 c( B% N
所以选择的时候,最好是两个都选中,这样既看到概括收集的信息,也能看到详细的收集信息。/ ?  k9 u1 I1 Z% [4 B
“Sort query log”是query的排序,by source是按照自然结果排序,by duration是按照查询时间的长短排序。, _7 C/ S1 |) g2 S, _9 I
“Slow query highlighting ”是把查询超过输入框数字的(比如本图的5ms)的query红色高亮显示。
- ]% W8 l! I9 m- e/ q“Store executed queries”是把执行的查询存贮到表里,有两个表devel_queries和devel_times。
, Q1 h8 @5 |+ Q4 A- o( U' _“Sampling interval”目前还没有搞清楚是做什么用的。& l& d5 S# v  C' @1 }' B
" R* B  l; |" T) K9 j9 T
2# ?: @2 z; z- D; Y6 g
“Display page timer ”选中是为了显示页面的执行时间在log box。: O* m9 |) r: C2 Z
“Display memory usage ”选中是为了显示内存用了多少。/ t) G# @0 v% F. a( j$ s
“Display redirection page”,如果一个模块执行一个drupal_goto函数的时候,query的信息可能会丢失。选中这个选项后会产生一个中间页,使得查询信息在页面跳转前完成。
5 f2 Z5 L6 C3 `$ z! F* R5 M8 ~( h; x; b“Display form element keys and weights”选中是为了显示内存用了多少。
: `( ]) J7 W, ~“Error handler ”为你的网站,选择一个错误句柄。Backtrace显示一个有好的错误信息提示,上图中“SMTP library”SMTP库的显示方式。3 S- b1 W; n: C. n' x( ]0 Q. R  }+ a

0 a) v! {7 }6 [6 k$ y9 u注意:* b1 e4 ^$ ~$ S" B* Q8 n' M6 A: K
devel的显示是可以控制的,需要到 管理》用户管理》访问控制 中去设置,哪个角色可以看到devel出来的信息,哪个角色不能看到。如下图所示
3 p* Z, r1 \5 Y/ J- V$ k3 `/ Z  g4 W2 f& s" }# a7 }$ Y5 h
引用一段说明* W5 E- I% B9 |7 @
元测试就是用来将成分分割成不同的独立单元,并决定每一单元的行为是否和期望的一样。尽管Drupal没有一个核心的单元测试API,但它拥有一个相关的学习小组(http://groups.drupal.org/unit-testing),而且它还有一些工具用来帮助开发者创建更高质量的代码。其中最著名的一个就是第3方模块——devel.module。
/ E) ^( ]0 N" J, B
- K( o# d# `6 TDevel模块9 v( u5 W! B. m7 A& c+ H) u  s+ o
Devel模块,最初由Moshe Weitzman编写的,它是一个大杂烩,用来帮助开发者调试和检查你的代码各个零碎的方面。
; I0 r4 S+ E9 @; [' n5 ?' S% v+ G( M0 X2 u# D2 F$ v
你可以从http://drupal.org/project/devel获取这个模块(或者使用CVS检出并获得更酷的效果)。安装了devel模块后,一定要启用devel区块。下面是devel区块中比较模糊的一些链接以及其能做什么的列表:/ g' _% q' L/ Y. J; \

5 U3 M  Z- A* p) _3 O• Empty Cache(清空缓存):清空数据库的用来存储页面、菜单、节点、和变量缓存的缓存表。更明确一点就是,这些要被清空的表有cache, cache_filter, cache_menu,和 cache_page。
, ?1 D  [/ V% |. R  m
" u0 [: e/ y) V) s9 d8 \注意 点击Empty Cache链接不能清空用户定制的缓存表。! i! X7 a; P, \4 g2 U2 R+ W% {
: Q; X/ H) ^6 r) R: W
• Function reference(函数引用): 使用PHP的get_defined_functions()得到在当前请求期间所用到用户函数列表。点击一个函数的名字可以查看它的文档。; M8 Z. }. k0 `: c# S
2 _* H/ p7 Z; E0 r: T: s( f, [' `
• Reinstall module(重装模块)s: 通过运行hook_install()来重新安装一个模块。Schema版本号将被设置成最近更新的版本号。在重新安装模块以前,一定要先手工的清理掉任何存在的由该模块生成的数据库表。
7 c+ m+ g% n3 ]- _+ s, R1 R
' X  C8 R' ?3 q8 q* c) v• Reset menus(重置菜单):将所有的菜单项重置到它们的默认设置上,并且删除所有的定制菜单项。
  C+ H" h$ s$ [0 h# i. I" u' S: T" |0 o" s# A4 R
• Variable viewer(变量查看器):列出当前存储在在variables表中以及你的settings.php文件的$conf数组中的所有变量以及它们的值。一般可以使用variable_get() 和 variable_set()来访问这些变量。
8 V( R8 j8 e, X1 i4 Y1 o* z/ E! K! }
( W9 g( \" m& G8 x1 O: P• Session viewer(会话查看器):展示你的$_SESSION变量的内容。
& Z3 d  U$ u! M7 N8 P3 r
0 ]0 W# w3 d6 V: i3 [) w展示查询
! e# i) b" r4 Y, d# V, I; v打开页面http://example.com/?q=admin/settings/devel,选住“Collect query info”(收集查询信息) 和 “Display query log”(展示查询日志)旁的复选框。
. R# F3 I" h7 K3 {8 X* L% Q" T: w# R0 e; c' t* E: |
一旦你保存了这些设置,你将会看到,在每个页面的最底部,都有一列查询列表,这些查询就是在生成你当前页面所用到的所有的查询!此外,列表还会告诉你生成查询的函数,该查询所耗费的时间,以及查询被调用的次数。- o! n* n. k# T2 R, [
7 Q. x) r' @0 @; h
在许多有见识的方式中你都可以使用这一信息。例如,如果同一查询在一个页面被调用了40次,那么你就需要检查一下你的代码看是否存在一个坏的循环结构体。如果确实是这样的话,你可以考虑实现一个静态变量,在请求期间,来保存数据库插叙结果。下面的例子说明了这个设计模式的样子(来自taxonomy.module):3 s- Q7 O+ {  F8 a. u
) X8 q$ z, F; x3 Y% ]% J& Z; n4 o
function taxonomy_get_term($tid) {, C  S) A3 M( R) `7 l
static $terms = array();2 w8 [, |7 ~# r# N  u3 i! w! o
if (!isset($terms[$tid])) {1 L6 A) m* W8 N$ Q' ?9 H. E
$terms[$tid] = db_fetch_object(db_query('SELECT * FROM {term_data} WHERE tid =9 z6 E; E. `2 K! R1 [
%d', $tid));* a0 V5 a9 L5 D
}6 q# E) K8 J- q% z
return $terms[$tid];
' b" Z+ [3 D2 z- F0 J}
! T7 }7 a9 {$ o, x& `0 n5 ^9 \' w" f$ k# y
我们创建了一个静态数组来保存结果集,这样如果查询已被执行过了,那么我们就已经有了这个值,这样就可以直接将其返回而不是再次查询数据库了。
4 i  @6 B3 T! y( u, D3 _3 `0 L& K
7 O" t2 J( j7 L$ e& ~处理耗费时间的查询5 b& b' ]2 l# ~% `
假定你已经编写了一个名为task(任务)的定制节点模块,而且你使用hook_load()来向节点对象追加关于任务的额外信息。表的schema如下:( A1 w2 V9 r2 E" E( Q. _
CREATE TABLE task (' x- {7 Z! V, a/ [% p2 w
nid int,5 j2 L% I+ y0 ?6 g! w( [6 P
vid int,
' [0 [& ]; I1 |# i6 f  D9 i' ?percent_done int,
8 R* `' G( Y) P5 {8 i% V/ @PRIMARY KEY (nid,vid),
3 H' r/ O4 {8 j- x2 _KEY nid (nid)( G$ Q  F- \6 ]0 \% I  F
);9 I1 D. Q& d( d& {! b0 F* z
# N7 J* ~" x3 J. `$ q  v6 f6 [' [
在运行了devel.module和查看了查询日志以后,你注意到针对上表的查询拖累你的站点性能!注意超过5毫秒的查询就被默认是缓慢的。# s) Y6 u* ]! g5 b' T1 P( S
$ z, q$ P' m& x! b' W% T
毫秒          函数              查询
7 ?2 P! o" s' }& g: i% \6 l27.16          task_load         SELECT * FROM task WHERE vid = 3
( e) t6 Q) i. B  ]1 m: t+ G/ F3 d! `+ [5 V& j/ X, n/ U! j
那么为什么这个查询这么耗时呢?如果它是一个使用多表关联的更复杂的查询,那么我们将考虑使用更好的方式来组织数据,但是它是一个非常简单的查询。首先要做的是使用SQL的EXPLAIN语法来查看数据库是怎么解释这个查询的。当你在一个SELECT语句前面追加一个关键字EXPLAIN时,数据库将返回该查询执行计划的相关信息。  F8 k9 h7 F% x2 U) Q1 s0 R0 U
! I. n& N8 w: ^1 b- E0 s! E" i5 A% J
EXPLAIN SELECT * FROM task WHERE vid = 3; B' @/ T1 _# z
MySQL给出下面的报告:
3 m% i2 W# A( O  [+ G1 v
$ [% A& |: ]( l* OId select_type table  type    possible_keys key  key_len  ref  rows  Extra( s$ p" Q6 W( W/ |; k7 k1 o
1  SIMPLE      task    system      NULL      NULL NULL     NULL  1; }  a0 ]7 h6 a  I
$ ]- F5 D3 r5 q
在这里最重要的一列就是key列,它现在的值为NULL。这告诉我们MySQL在获取结果集时没有使用任何的主键、UNIQUE键、或者索引键;它需要一行一行的查找。所以加快这个查询速度的最好方式是向vid列添加一个UNIQUE键。
( c6 P4 a9 {  V% O! b9 R; Y; A
# k8 D' b9 j5 K% zALTER TABLE task ADD UNIQUE (vid);0 Z" |; m' Q3 u# J! {9 g  I7 M

* K& ]2 g* P9 ~1 a9 g7 O更多关于MySQL的EXPLAIN信息,参看http://dev.mysql.com/doc/refman/5.0/en/explain.html& [; T# I+ R; F6 i" v& U

; p* S& y# v  I9 GDevel模块的其它用途
4 D4 D- ^* b" f- rDevel模块还有一些其它一些方便函数,它们常被忽略却能增加你的开发效率的。$ f, m. j0 B+ ~/ p9 |. ~1 O( g

0 Q& r3 H7 ], V6 x1 V) k5 n例如,你可以实时的切换当前查看Drupal页面的用户。这对于技术支持和调试其它角色非常有用。为了切换到另一个用户上,导航到URL http://example.com/?q=devel/switch/$uid,其中$uid是你想切换到的用户的ID。另一种方式是,启用“Switch users”(切换用户)区块,它提供了达到相同功能的一组链接。
: P- w# M; n4 W; q% M+ x+ G& J
6 q$ |0 a: x6 ]. \. d你可以使用dsm(), dvm(),dpr(),和 dvr()函数来输出调试信息,这些信息对于其它用户是不可见的。) w- W! h& N7 o; [3 b4 u* X9 g
• dsm() 向页面的消息区域输出一个简单变量(比如,一个字符串或者一个整数。)3 y- K6 F$ I1 R! t
• dvm()向页面的消息区域输出一个var_dump()。对于复杂的变量比如数组或者对象使用这个函数。
0 N$ T( C" I4 v/ Q7 R3 z: V• dpr() 使用一个递归函数在页面顶部输出一个复杂的变量(比如一个数组或者对象)。- l0 n6 T/ ~) j
• dvr()在页面顶部输出一个var_dump()。
2 i" f) l4 x: ?; y4 w" `2 c8 x' S8 ]' k, s0 r9 m- z, S4 x/ r
这些函数的输出对于没有“access devel information”(“访问devel信息”)权限的用户是不可见的,这对于实时调试非常方便。( O( g( \$ l  k0 H
  i. ^& {8 H* c$ D% ~& r
一个使用的例子如下所示:" D7 a" K+ B$ ?/ w4 D
dpr(node_load(5)); // Display the data structure of node 5., B" e- K4 o0 \  d1 h! u1 j6 d8 \
dvr($user); // Display the $user variable.( V9 k# }* ]% }: Z: b
本部分摘自:http://www.5iphp.com/drupal-devel ,谢谢!/ |* e! p3 }) L' O! J

/ X0 i/ b& s8 ?/ j- `9 ?# M( v( v& t$ o

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

GMT+8, 11-12-2025 07:12 , Processed in 0.183443 second(s), 75 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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