drupal教程 关于devel模块应用

来源:互联网 发布:淘宝店铺抽奖中奖结果 编辑:程序博客网 时间:2024/06/04 18:01

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

本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信息”)权限的用户是不可见的,这对于实时调试非常方便。
 
一个使用的例子如下所示:
dpr(node_load(5)); // Display the data structure of node 5.
dvr($user); // Display the $user variable.

原创粉丝点击