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

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,微信登陆

搜索

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

[复制链接]
发表于 2-6-2012 21:14 | 显示全部楼层 |阅读模式
Devel模块是个大杂烩,里面包含了许多实用功能,开发者可用它来调试和检查代码的各种细节。0 T0 @$ E( x' |! W

& A4 f) ^7 {2 R6 j 你可以从http://drupal.org/project/devel下载该模块(或者使用CVS签出并获得更酷的效果)。安装了devel模块后,一定要启用devel区块。下面是devel区块中一些含义比较模糊的链接,这里给出了明确的解释:
  y% O( U/ |9 [: l" l6 z# _9 s1 m. W+ \( Q0 }
• 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()(它返回一个数组,里面包含了要被清空的缓存表的名字),那么这些缓存表也被清空。
& u# \) D* b& B# r) U' p* E4 F
! j/ c4 i4 X7 t. Z. |* Y• Enable Theme developer(启用主题开发者): 这个链接用来启用主题开发者模块,启用这个模块后,将鼠标指向一个页面元素,就会为你显示出用来生成这个页面元素的模板或主题函数了(参看第8章)。
6 o6 L, _  d3 B% z8 X; H* [
2 h" T: E- L- y• Function reference(函数引用): 这个函数提供了一列用户函数,这些函数是在这个请求期间使用PHP的get_defined_functions()定义的。点击一个函数的名字,可以查看它的文档。
  T7 G( o' `1 \, q$ H$ P) b* \6 Z8 r) j9 Y  r9 d( d
• Hook_elements(): 这个链接使用一种便于阅读的格式来显示hook_elements()调用的结果,在使用表单API时,它会非常有用。
+ N4 L3 ^: w, ?: h* N3 p7 K; Q+ @3 d
- N/ H% ^" y! H6 z• Rebuild menus(重构菜单): 这个调用menu_rebuild(),它将清空并重新构建menu_router表,同时更新menu_links表(参看第4章)。% p0 Q, [+ }! o8 G( U

: j. H% P5 ?' H. n. |& B4 _• Reinstall modules(重装模块): 通过运行hook_uninstall()和hook_install()来重新安装一个模块。模式版本号将被设置成最近更新的号码。在重新安装模块以前,对于任何已有的数据库表,如果其对应模块没有实现hook_uninstall(),那么一定要手动的将其清除。
2 x* m7 m* Z  h% S- }. t. Y" k; w, C6 h! c
• Session viewer(会话查看器): 使用这个链接来显示你的$_SESSION变量的内容。
" N) Y, B) ?8 L& e
8 a9 U* F) [3 c0 l$ ]' A7 ]7 k• Variable editor(变量编辑器):这个链接列出当前存储在variables表中以及你的settings.php文件的$conf数组中的所有变量及它们的值,它还允许你对这些变量进行编辑。一般可以使用variable_get() 和 variable_set()来访问这些变量。4 C8 G4 l$ m6 p! r: f7 D
) x7 [4 H! s9 E1 w9 @: o1 T

, A% k1 P( V' B( Y本文摘自:http://zhupou.cn。谢谢!6 ?/ R% V5 x! F

2 i) s* \, J; V* v( K- A" T9 L3 w3 [, O" m1 W/ O: J: q, Y. m
--------------------------------------------------------------------------------------------------------------------------------------
- K# Z6 F. _! k0 `  v( W* U下面内容也是相关的,合一吧:
" n% D: {0 d" [) S/ x9 S--------------------------------------------------------------------------------------------------------------------------------------
8 N4 t/ g! K" B# F6 _, O: ~$ v0 {9 W

2 L( a' q3 g8 g本drupal教程主要说的是devel模块。* h: A, ^9 F. O& t) a9 l5 b# f
devel模块是开发用的,可以显示数据库查询和页面执行的时间。
7 E# @2 V3 Z- z# d
/ E4 `( b8 H1 P' Z% G7 @1
% H4 N+ U% F6 ]- Z“Collect query info ”选中以后,收集query的相关信息。/ O$ T, ]5 Z" r# n5 |
“Display query log”选中以后,是将上面收集query的相关信息展示出来。
0 g7 x! g5 H9 [( X所以选择的时候,最好是两个都选中,这样既看到概括收集的信息,也能看到详细的收集信息。* I2 J' w9 N5 D& U- [0 a+ V9 V
“Sort query log”是query的排序,by source是按照自然结果排序,by duration是按照查询时间的长短排序。5 f  J2 {% d- z+ B% v% `- I3 O/ Y
“Slow query highlighting ”是把查询超过输入框数字的(比如本图的5ms)的query红色高亮显示。
* p! I+ D+ i6 e6 N, c“Store executed queries”是把执行的查询存贮到表里,有两个表devel_queries和devel_times。
0 U( o# f- H$ ~2 M7 W1 d7 t: I“Sampling interval”目前还没有搞清楚是做什么用的。
- W& Z  m, O6 j  l; K7 s% i, z: U6 n
2/ {3 y$ U7 y& ~: Q; ~: Q( S) a$ F
“Display page timer ”选中是为了显示页面的执行时间在log box。
3 F0 }% h: ]* R“Display memory usage ”选中是为了显示内存用了多少。- F' Y, U( w* K4 P4 g
“Display redirection page”,如果一个模块执行一个drupal_goto函数的时候,query的信息可能会丢失。选中这个选项后会产生一个中间页,使得查询信息在页面跳转前完成。; |; ~4 E* t9 c: l" O+ k* r
“Display form element keys and weights”选中是为了显示内存用了多少。# K( |6 L$ K0 U5 f( y% m  b
“Error handler ”为你的网站,选择一个错误句柄。Backtrace显示一个有好的错误信息提示,上图中“SMTP library”SMTP库的显示方式。
; X" a2 m5 d7 c" c. k
4 H. C9 ^% n8 m3 Z) J( W/ d7 b注意:
. [; K% i: t7 S9 x/ Y8 m3 @devel的显示是可以控制的,需要到 管理》用户管理》访问控制 中去设置,哪个角色可以看到devel出来的信息,哪个角色不能看到。如下图所示
, u7 H5 G( o" N% U2 w& S# |  k1 {7 e0 D" a+ @+ W
引用一段说明# M9 O6 i& x* P& q0 S
元测试就是用来将成分分割成不同的独立单元,并决定每一单元的行为是否和期望的一样。尽管Drupal没有一个核心的单元测试API,但它拥有一个相关的学习小组(http://groups.drupal.org/unit-testing),而且它还有一些工具用来帮助开发者创建更高质量的代码。其中最著名的一个就是第3方模块——devel.module。
* _9 ~1 C" x% M; `& R
' x9 _2 |& Q$ |2 j/ j! J( g- rDevel模块: J/ l6 |' \+ @7 e9 H0 M7 `' H
Devel模块,最初由Moshe Weitzman编写的,它是一个大杂烩,用来帮助开发者调试和检查你的代码各个零碎的方面。0 D/ a1 V+ L; R0 x/ _7 t$ R. |* d
/ x. A4 @* G  b$ f0 Z; z9 h
你可以从http://drupal.org/project/devel获取这个模块(或者使用CVS检出并获得更酷的效果)。安装了devel模块后,一定要启用devel区块。下面是devel区块中比较模糊的一些链接以及其能做什么的列表:
4 h2 q6 L5 ~7 `1 ~: g1 e7 `" @" ]. }0 I4 N6 @: J
• Empty Cache(清空缓存):清空数据库的用来存储页面、菜单、节点、和变量缓存的缓存表。更明确一点就是,这些要被清空的表有cache, cache_filter, cache_menu,和 cache_page。" f! C0 w4 O& |3 ~9 n- C( [
$ k/ ]+ I3 Y/ P; M9 z
注意 点击Empty Cache链接不能清空用户定制的缓存表。
! ^) r. `/ C( q4 J
0 b# ^( L4 x: `; E7 W• Function reference(函数引用): 使用PHP的get_defined_functions()得到在当前请求期间所用到用户函数列表。点击一个函数的名字可以查看它的文档。. X6 F2 o& t0 i" i
# U" s8 @8 l8 P5 j! R8 x! T
• Reinstall module(重装模块)s: 通过运行hook_install()来重新安装一个模块。Schema版本号将被设置成最近更新的版本号。在重新安装模块以前,一定要先手工的清理掉任何存在的由该模块生成的数据库表。
* f" `4 F6 ?4 o! F, G, n
- o  M# \! ?! c, \9 m• Reset menus(重置菜单):将所有的菜单项重置到它们的默认设置上,并且删除所有的定制菜单项。
  Q8 s2 B9 ^5 ]0 r$ y9 F( D
3 G% Q" }5 t1 q• Variable viewer(变量查看器):列出当前存储在在variables表中以及你的settings.php文件的$conf数组中的所有变量以及它们的值。一般可以使用variable_get() 和 variable_set()来访问这些变量。
# j6 h, z0 U* W: g) C& T+ k) J1 o
• Session viewer(会话查看器):展示你的$_SESSION变量的内容。
& X# I1 K6 w) Y) ]
0 K# ~7 F' S+ f6 N6 V3 m* [9 i2 u展示查询% b+ T5 e. v  ]
打开页面http://example.com/?q=admin/settings/devel,选住“Collect query info”(收集查询信息) 和 “Display query log”(展示查询日志)旁的复选框。
3 X- F1 z9 L7 B0 V# u$ K7 I+ T0 {' y7 {' \1 t8 y" d& {3 E7 i0 {
一旦你保存了这些设置,你将会看到,在每个页面的最底部,都有一列查询列表,这些查询就是在生成你当前页面所用到的所有的查询!此外,列表还会告诉你生成查询的函数,该查询所耗费的时间,以及查询被调用的次数。/ I5 w, c7 x1 }+ d
9 `& t% V8 s. ]" G
在许多有见识的方式中你都可以使用这一信息。例如,如果同一查询在一个页面被调用了40次,那么你就需要检查一下你的代码看是否存在一个坏的循环结构体。如果确实是这样的话,你可以考虑实现一个静态变量,在请求期间,来保存数据库插叙结果。下面的例子说明了这个设计模式的样子(来自taxonomy.module):4 n5 \# c, o$ g) ?' y( ]9 r1 w
1 ?- X3 z, L2 ?) \4 N# G8 _
function taxonomy_get_term($tid) {
. p1 _  w* p  n& x2 _static $terms = array();
, v! O$ i3 k. ]if (!isset($terms[$tid])) {
2 w6 J5 s/ f, x; A$terms[$tid] = db_fetch_object(db_query('SELECT * FROM {term_data} WHERE tid =
& \% R9 ~& ^' C1 b% ?8 K5 Y0 p%d', $tid));. C% g( i7 H  y. ]% P& ^
}
" _7 e9 X! t+ }5 rreturn $terms[$tid];1 e. F  L7 C% D* |3 `& @  N
}
+ |5 ^6 g9 Q2 ]# y- D
0 n  H0 N- h0 J9 J我们创建了一个静态数组来保存结果集,这样如果查询已被执行过了,那么我们就已经有了这个值,这样就可以直接将其返回而不是再次查询数据库了。! f# s5 n: p$ S, f3 \+ L
% M  A' ?5 p! X. |. o$ `: b- y% r
处理耗费时间的查询7 }/ A) ^' H' x! [1 \8 y. ^$ o7 G
假定你已经编写了一个名为task(任务)的定制节点模块,而且你使用hook_load()来向节点对象追加关于任务的额外信息。表的schema如下:& ~( {: d8 [. M
CREATE TABLE task (! W7 t8 p1 i! w4 ~, e' @9 r" ~- s
nid int,/ A% E# y: Q' d% d* c* H  N; J
vid int,
+ ]/ s  Y3 k3 j0 h6 {/ x. Kpercent_done int," t4 l/ x3 x; B3 g
PRIMARY KEY (nid,vid),9 L5 M3 }* ]; \6 M: j0 N$ p
KEY nid (nid)
# Q% A# H' l7 }  [" I  x7 T9 U5 s);
- H/ f0 C( @$ Z7 s8 ]. o* K6 x1 p. J" v1 D5 Q0 A
在运行了devel.module和查看了查询日志以后,你注意到针对上表的查询拖累你的站点性能!注意超过5毫秒的查询就被默认是缓慢的。
! V" v. G" m* h- ^# W* r1 P$ `; x% G; V0 Y/ T$ u! F( |1 J
毫秒          函数              查询
5 \1 v) |7 J4 t, a27.16          task_load         SELECT * FROM task WHERE vid = 3
2 B3 }( P0 A; D- Y  g+ p4 F( y4 Z' L
那么为什么这个查询这么耗时呢?如果它是一个使用多表关联的更复杂的查询,那么我们将考虑使用更好的方式来组织数据,但是它是一个非常简单的查询。首先要做的是使用SQL的EXPLAIN语法来查看数据库是怎么解释这个查询的。当你在一个SELECT语句前面追加一个关键字EXPLAIN时,数据库将返回该查询执行计划的相关信息。4 Y" J1 B6 ]- P9 ~; r9 t) w4 z$ l

6 a4 o% Q& I! G( e5 H* TEXPLAIN SELECT * FROM task WHERE vid = 3
2 B( J) O& s/ U6 q$ }& t4 NMySQL给出下面的报告:1 ^& N0 A, M7 }& y+ m3 o

( K3 w# ]# X  Y* {/ FId select_type table  type    possible_keys key  key_len  ref  rows  Extra
* G! `) c% m# `1  SIMPLE      task    system      NULL      NULL NULL     NULL  1  d: p' d! u4 f3 N

, V! h4 X$ v; r: {, r2 N9 W在这里最重要的一列就是key列,它现在的值为NULL。这告诉我们MySQL在获取结果集时没有使用任何的主键、UNIQUE键、或者索引键;它需要一行一行的查找。所以加快这个查询速度的最好方式是向vid列添加一个UNIQUE键。; ]; c9 A# x0 J2 T

3 y* C& Z" n1 }5 GALTER TABLE task ADD UNIQUE (vid);% C9 d. x# s, Z

$ B6 e5 M# ~/ |9 S! K. C更多关于MySQL的EXPLAIN信息,参看http://dev.mysql.com/doc/refman/5.0/en/explain.html2 z8 B' p2 s# u0 y" ^) M& X/ i

# N. A; F, |) \! x% @6 UDevel模块的其它用途" d: S  @  e+ ?0 M6 ?( F' r
Devel模块还有一些其它一些方便函数,它们常被忽略却能增加你的开发效率的。
# P* q- M5 X; [1 n9 G3 C  Q% A) E5 }1 v
例如,你可以实时的切换当前查看Drupal页面的用户。这对于技术支持和调试其它角色非常有用。为了切换到另一个用户上,导航到URL http://example.com/?q=devel/switch/$uid,其中$uid是你想切换到的用户的ID。另一种方式是,启用“Switch users”(切换用户)区块,它提供了达到相同功能的一组链接。
# I9 M3 g7 P! ?0 }' ]) n/ K
' u5 g* F' Z2 p! ~" X你可以使用dsm(), dvm(),dpr(),和 dvr()函数来输出调试信息,这些信息对于其它用户是不可见的。# [# ?: N( W# d
• dsm() 向页面的消息区域输出一个简单变量(比如,一个字符串或者一个整数。)
8 ~8 v. @# \; O3 y• dvm()向页面的消息区域输出一个var_dump()。对于复杂的变量比如数组或者对象使用这个函数。8 ?, r5 n0 U6 J2 K8 _- w- x3 t6 d1 a
• dpr() 使用一个递归函数在页面顶部输出一个复杂的变量(比如一个数组或者对象)。
4 Z9 L: q6 K* }7 f( y: A• dvr()在页面顶部输出一个var_dump()。
" Q, l3 Q- \0 N1 ?  \/ X- Q4 x! a! D5 T/ n7 P
这些函数的输出对于没有“access devel information”(“访问devel信息”)权限的用户是不可见的,这对于实时调试非常方便。" d& d" e% }0 K; v) f
( ]$ _2 K% N1 j# |
一个使用的例子如下所示:( X0 {# @2 I0 Q0 f/ t- v
dpr(node_load(5)); // Display the data structure of node 5.
7 V  Y/ v& D- q7 i% |dvr($user); // Display the $user variable.
$ U* D8 d& m+ j$ U4 b本部分摘自:http://www.5iphp.com/drupal-devel ,谢谢!5 K, o9 d7 P; W" M& T* N. A
5 k/ V7 ^& r3 S" P- v/ ?
; [" n) t0 `5 n$ B  B" k. X7 }$ F

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

GMT+8, 5-2-2025 20:55 , Processed in 0.448921 second(s), 389 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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