You are here

Drupal专业开发指南 第22章 识别耗费资源的页面

识别耗费资源的页面

    为了找出哪些页面是最耗费资源的,需要启用Drupal自带的统计模块。尽管统计模块增加了你的服务器的负担(由于它将你的站点的访问统计记录到了数据库中),但它能够帮助我们找出哪些页面的访问量最大,对于这些页面我们要进行更多的优化。它也可以用来追踪一个时期内生成页面的总时间,你可以在“管理➤报告➤访问日志设置”中进行声明。这可以用于识别耗费系统资源不能控制的网络爬虫,通过访问“管理➤报告➤浏览者排行”并点击 “禁止”来禁止该网络爬虫的访问。你还需要小心一点----有时候会很容易的禁用掉一个好的网络爬虫,就是能够给你的站点带来访问量的爬虫。在禁止网络爬虫以前,你一定要先检查一下它的出处。
 
识别耗费资源的代码
    看一下下面耗费资源的代码:
 
// Very expensive, silly way to get node titles. First we get the node IDs
// of all published nodes.
$sql = "SELECT n.nid FROM {node} n WHERE n.status = 1";
 
// We wrap our node query in db_rewrite_sql() so that node access is respected.
$result = db_rewrite_sql(db_query($sql));
 
// Now we do a node_load() on each individual node.
while ($data = db_fetch_object($result)) {
    $node = node_load($data->nid);
    // And save the titles.
    $titles[$node->nid] = check_plain($node->title);
}
 
完全加载一个节点是一个耗费资源的操作:运行钩子函数,通过模块处理数据库查询来添加或者修改节点,使用内存来在node_load()内部中缓存节点。如果你不依赖于其它模块对节点的修改,直接对节点表进行你自己的查询,速度将会更快一些。当然这仅仅是一个例子,但是常常会遇到同样的情景,也就是,许多时候数据是通过多个查询来取回的,而实际上可以将多个查询合并成一个简单的查询,或者不需要加载整个节点,就可以完成所要的操作。
 
提示 Drupal拥有一个内部的缓存机制(使用了一个静态变量),当在一个请求中多次加载同一节点时就会使用这一机制。例如,如果调用了node_load(1)。节点1将被完全加载并被缓存。当在同一个web请求中再次调用node_load(1)时,Drupal将会返回前面使用相同节点ID加载节点的缓存结果。
 

Drupal版本: