欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

drupal教程 关于devel模块应用

shiping1 的头像

drupal教程 关于devel模块应用

本drupal教程主要说的是devel模块。
devel模块是开发用的,可以显示数据库查询和页面执行的时间。

图1

图1所示的“Collect query info ”选中以后,收集query的相关信息。
图1所示的“Display query log”选中以后,是将上面收集query的相关信息展示出来。
所以选择的时候,最好是两个都选中,这样既看到概括收集的信息,也能看到详细的收集信息。
图1所示的“Sort query log”是query的排序,by source是按照自然结果排序,by duration是按照查询时间的长短排序。
图1所示的“Slow query highlighting ”是把查询超过输入框数字的(比如本图的5ms)的query红色高亮显示。
图1所示的“Store executed queries”是把执行的查询存贮到表里,有两个表devel_queries和devel_times。
图1所示的“Sampling interval”目前还没有搞清楚是做什么用的。


图2

上图中“Display page timer ”选中是为了显示页面的执行时间在log box。
上图中“Display memory usage ”选中是为了显示内存用了多少。

上图中“Display redirection page”,如果一个模块执行一个drupal_goto函数的时候,query的信息可能会丢失。选中这个选项后会产生一个中间页,使得查询信息在页面跳转前完成。
上图中“Display form element keys and weights”选中是为了显示内存用了多少。
上图中“Error handler ”为你的网站,选择一个错误句柄。Backtrace显示一个有好的错误信息提示,上图中“SMTP library”SMTP库的显示方式。

注意:
devel的显示是可以控制的,需要到 管理》用户管理》访问控制 中去设置,哪个角色可以看到devel出来的信息,哪个角色不能看到。如下图所示

引用一段说明
元 测试就是用来将成分分割成不同的独立单元,并决定每一单元的行为是否和期望的一样。尽管Drupal没有一个核心的单元测试API,但它拥有一个相关的学 习小组(http://groups.drupal.org/unit-testing),而且它还有一些工具用来帮助开发者创建更高质量的代码。其中最 著名的一个就是第3方模块——devel.module。
 
Devel模块
Devel模块,最初由Moshe Weitzman编写的,它是一个大杂烩,用来帮助开发者调试和检查你的代码各个零碎的方面。
 
你可以从http://drupal.org/project/devel获取这个模块(或者使用CVS检出并获得更酷的效果)。安装了devel模块后,一定要启用devel区块。下面是devel区块中比较模糊的一些链接以及其能做什么的列表:
 
• Empty Cache(清空缓存):清空数据库的用来存储页面、菜单、节点、和变量缓存的缓存表。更明确一点就是,这些要被清空的表有cache, cache_filter, cache_menu,和 cache_page。
 

注意 点击Empty Cache链接不能清空用户定制的缓存表。

 
• Function reference(函数引用): 使用PHP的get_defined_functions()得到在当前请求期间所用到用户函数列表。点击一个函数的名字可以查看它的文档。
 
• Reinstall module(重装模块)s: 通过运行hook_install()来重新安装一个模块。Schema版本号将被设置成最近更新的版本号。在重新安装模块以前,一定要先手工的清理掉任何存在的由该模块生成的数据库表。
 
• Reset menus(重置菜单):将所有的菜单项重置到它们的默认设置上,并且删除所有的定制菜单项。
 
• Variable viewer(变量查看器):列出当前存储在在variables表中以及你的settings.php文件的$conf数组中的所有变量以及它们的值。一般可以使用variable_get() 和 variable_set()来访问这些变量。
 
• Session viewer(会话查看器):展示你的$_SESSION变量的内容。
 
展示查询
打开页面http://example.com/?q=admin/settings/devel,选住“Collect query info”(收集查询信息) 和 “Display query log”(展示查询日志)旁的复选框。
 
一旦你保存了这些设置,你将会看到,在每个页面的最底部,都有一列查询列表,这些查询就是在生成你当前页面所用到的所有的查询!此外,列表还会告诉你生成查询的函数,该查询所耗费的时间,以及查询被调用的次数。
 
在 许多有见识的方式中你都可以使用这一信息。例如,如果同一查询在一个页面被调用了40次,那么你就需要检查一下你的代码看是否存在一个坏的循环结构体。如 果确实是这样的话,你可以考虑实现一个静态变量,在请求期间,来保存数据库插叙结果。下面的例子说明了这个设计模式的样子(来自 taxonomy.module):
 
function taxonomy_get_term($tid) {
static $terms = array();
if (!isset($terms[$tid])) {
$terms[$tid] = db_fetch_object(db_query('SELECT * FROM {term_data} WHERE tid =
%d', $tid));
}
return $terms[$tid];
}
 
我们创建了一个静态数组来保存结果集,这样如果查询已被执行过了,那么我们就已经有了这个值,这样就可以直接将其返回而不是再次查询数据库了。
 
处理耗费时间的查询
假定你已经编写了一个名为task(任务)的定制节点模块,而且你使用hook_load()来向节点对象追加关于任务的额外信息。表的schema如下:
CREATE TABLE task (
nid int,
vid int,
percent_done int,
PRIMARY KEY (nid,vid),
KEY nid (nid)
);
 
在运行了devel.module和查看了查询日志以后,你注意到针对上表的查询拖累你的站点性能!注意超过5毫秒的查询就被默认是缓慢的。

 

毫秒          函数              查询

27.16          task_load         SELECT * FROM task WHERE vid = 3

 
那 么为什么这个查询这么耗时呢?如果它是一个使用多表关联的更复杂的查询,那么我们将考虑使用更好的方式来组织数据,但是它是一个非常简单的查询。首先要做 的是使用SQL的EXPLAIN语法来查看数据库是怎么解释这个查询的。当你在一个SELECT语句前面追加一个关键字EXPLAIN时,数据库将返回该 查询执行计划的相关信息。
 
EXPLAIN SELECT * FROM task WHERE vid = 3
MySQL给出下面的报告:

 

Id select_type table  type    possible_keys key  key_len  ref  rows  Extra

1  SIMPLE      task    system      NULL      NULL NULL     NULL  1

 
在这里最重要的一列就是key列,它现在的值为NULL。这告诉我们MySQL在获取结果集时没有使用任何的主键、UNIQUE键、或者索引键;它需要一行一行的查找。所以加快这个查询速度的最好方式是向vid列添加一个UNIQUE键。
 
ALTER TABLE task ADD UNIQUE (vid);
 
更多关于MySQL的EXPLAIN信息,参看http://dev.mysql.com/doc/refman/5.0/en/explain.html
 
Devel模块的其它用途
Devel模块还有一些其它一些方便函数,它们常被忽略却能增加你的开发效率的。
 
例如,你可以实时的切换当前查看Drupal页面的用户。这对于技术支持和调试其它角色非常有用。为了切换到另一个用户上,导航到URL http://example.com/?q=devel/switch/$uid,其中$uid是你想切换到的用户的ID。另一种方式是,启用“Switch users”(切换用户)区块,它提供了达到相同功能的一组链接。
 
你可以使用dsm(), dvm(),dpr(),和 dvr()函数来输出调试信息,这些信息对于其它用户是不可见的。
• dsm() 向页面的消息区域输出一个简单变量(比如,一个字符串或者一个整数。)
• dvm()向页面的消息区域输出一个var_dump()。对于复杂的变量比如数组或者对象使用这个函数。
• dpr() 使用一个递归函数在页面顶部输出一个复杂的变量(比如一个数组或者对象)。
• dvr()在页面顶部输出一个var_dump()。
 
这些函数的输出对于没有“access devel information”(“访问devel信息”)权限的用户是不可见的,这对于实时调试非常方便。

 

<span id="thmr_6198" class="thmr_call"> devel</span> 模块
access devel information
display source code
执行Php代码
switch users
<span id="thmr_6211" class="thmr_call"> devel_node_access</span> 模块
view devel_node_access information
<span id="thmr_6215" class="thmr_call"> devel_themer</span> 模块
access devel theme information

 
一个使用的例子如下所示:
dpr(node_load(5)); // Display the data structure of node 5.
dvr($user); // Display the $user variable.

来自 http://hi.baidu.com/cfans_gpl/item/e2a78c30c8ad30ca1a9696e8


普通分类: