错误信息

Deprecated function: The each() function is deprecated. This message will be suppressed on further calls 在 menu_set_active_trail() (行 2405/data/itxueku/includes/menu.inc).

通过Hack来提高Boost模块的性能

浏览:121
Boost模块,Drupal高性能网站中的必备利器,前文《Drupal性能优化之-将Boost模块用到极致》详细讲解了几处对Boost模块的优化。但是近期笔者通过对一个大型drupal网站的性能跟踪,发现Boost模块本身会有性能问题,本文就几点Boost的使用经验做个总结。

1. 防止Boost清除缓存
Boost模块实现了hook_nodeapi,在node每次更新、保存等操作的时候,Boost都会清除cache。Boost清除内存是一个极其费时的操作,在许多场合下,我们不需要清除缓存的操作,比如content_profile的操作。

在node_save的时候,drupal默认有一个选项,是否清除缓存,代码如下:





  // Clear the page and block caches.
  if (variable_get('node_save_clear_cache', TRUE)) {cache_clear_all();
  }

同样,可以把这个操作带到Boost,在boost.module模块里面,修改nodeapi如下,





function boost_nodeapi(&$node, $op, $teaser = NULL, $page = NULL) {
  if (!BOOST_ENABLED) return;   //Don't clear the cache if we set it FALSE
  if (!variable_get('node_save_clear_cache', TRUE)) {return;
  }

这样,在node_save的时候,设置node_save_clear_cache为false即可。(注意:不要用variable_set)





global $conf;$conf['node_save_clear_cache'] = FALSE;node_save($node);...

2. 让登录用户的访问也产生Boost缓存
默认情况下,登录用户的访问不会生产Boost的静态缓存。但是有时,登录用户也需要缓存某些页面。比如,所有登录用户相同调查页面、欢迎页面。或者登录用户访问的页面和匿名用户访问的页面完全一样,则可以共享静态页面缓存。


这里我们可以通过修改Boost模块,让登录用户的访问也产生缓存,修改boost_init函数的末尾位置:





  //Check $conf variable
  //Determine if we should cache file
  $GLOBALS['_boost_should_cached'] = FALSE;
  $must_cache_files = isset($GLOBALS['conf']['cache_boost']) ? $GLOBALS['conf']['cache_boost'] : FALSE;
  if ($must_cache_files) {if (is_string($must_cache_files)) {  $must_cache_files = array($must_cache_files);}foreach ($must_cache_files as $cache_file ) {  if ($cache_file)  if (drupal_match_path($_GET['q'], $cache_file)) {$GLOBALS['_boost_should_cached'] = TRUE;break;  }}
  }   // We only generate cached pages for anonymous visitors.
  if (empty($user->uid) || $GLOBALS['_boost_should_cached']) {if (BOOST_ENABLED != CACHE_AGGRESSIVE) {  $GLOBALS['conf']['cache'] = CACHE_DISABLED;}$GLOBALS['_boost_cache_this'] = TRUE;register_shutdown_function('_boost_ob_handler');ob_start();
  }

添加了如上面的代码之后,如果想要强行缓存某些页面(无论是否是匿名/登录用户访问),在settings.php里面添加如下设置,





$conf['cache_boost'][] = '/page1';$conf['cache_boost'][] = '/page2/*';

3. 让登录用户读取boost缓存
默认情况,对于登录用户的访问,用户不会读取boost的缓存页面,前文《Drupal性能优化之-将Boost模块用到极致》中讲解过如何修改apache配置文件让登录用户访问Boost缓存。但是如果我们不需要对所有登录用户使用静态缓存,只需要对某个页面的话,则需要简单如下设置。





  ## Cache for special page
  RewriteCond %{REQUEST_URI} /page/1
  RewriteRule .* - [S=1]
 
  # Caching for anonymous users
  # Skip boost IF not get request OR uri has wrong dir OR cookie is set OR request came from this server OR https request
  RewriteCond %{REQUEST_METHOD} !^(GET|HEAD)$ [OR]
  RewriteCond %{REQUEST_URI} (^/(admin|cache|misc|modules|sites|system|openid|themes|node/add))|(/(comment/reply|edit|user|user/(login|password|register))$) [OR]
  RewriteCond %{HTTP_COOKIE} DRUPAL_UID [OR]
  RewriteCond %{HTTP:Pragma} no-cache [OR]
  RewriteCond %{HTTP:Cache-Control} no-cache [OR]
  RewriteCond %{HTTPS} on
  RewriteRule .* - [S=1]

以上是Boost模块的几个小小修改,以便来提高Drupal的性能



top