当前位置:首页 > CMS教程 > 其它CMS > 列表

Drupal模块讲解-Authcache缓存原理详解教程

发布:smiling 来源: PHP粉丝网  添加日期:2015-04-15 14:29:06 浏览: 评论:0 

Authcache模块和Boost模块的原理不一样,Boost模块是生成静态页面,所以缓存的效果最好,速度最快,Authcache模块是利用Drupal自身的缓存机制,生成页面缓存,由于进入到了Drupal环节,因此速度没有Boost缓存快,但是优点就是可以灵活的使用PHP/Drupal相关方法,动态处理数据.

Drupal模块讲解-Authcache缓存原理详解教程

首先,我们从Drupal的bootstrap讲起.

  1. function drupal_bootstrap($phase = NULL, $new_phase = TRUE) { 
  2.   // Not drupal_static(), because does not depend on any run-time information. 
  3.   static $phases = array
  4.     DRUPAL_BOOTSTRAP_CONFIGURATION, 
  5.     DRUPAL_BOOTSTRAP_PAGE_CACHE, 
  6.     DRUPAL_BOOTSTRAP_DATABASE, 
  7.     DRUPAL_BOOTSTRAP_VARIABLES, 
  8.     DRUPAL_BOOTSTRAP_SESSION, 
  9.     DRUPAL_BOOTSTRAP_PAGE_HEADER, 
  10.     DRUPAL_BOOTSTRAP_LANGUAGE, 
  11.     DRUPAL_BOOTSTRAP_FULL, 
  12.   ); 
  13. …. 

这是Drupal自带的bootstrap的几个环节(Drupal7),从CONFIGURATION、一直到 FULL,这样整个Drupal就启动了,所有的模块也加载了.

其中我们发现,有一个环节叫 PAGE_CACHE,我们来把这个阶段的处理函数完整的贴出来,以便大家能更好的理解这段代码.

  1. function _drupal_bootstrap_page_cache() { 
  2.   global $user
  3.  
  4.   // Allow specifying special cache handlers in settings.php, like 
  5.   // using memcached or files for storing cache information. 
  6.   require_once DRUPAL_ROOT . '/includes/cache.inc'
  7.   foreach (variable_get('cache_backends'array()) as $include) { 
  8.     require_once DRUPAL_ROOT . '/' . $include
  9.   }  //开源软件:phpfensi.com 
  10.   // Check for a cache mode force from settings.php. 
  11.   if (variable_get('page_cache_without_database')) { 
  12.     $cache_enabled = TRUE; 
  13.   } 
  14.   else { 
  15.     drupal_bootstrap(DRUPAL_BOOTSTRAP_VARIABLES, FALSE); 
  16.     $cache_enabled = variable_get('cache'); 
  17.   } 
  18.   drupal_block_denied(ip_address()); 
  19.   // If there is no session cookie and cache is enabled (or forced), try 
  20.   // to serve a cached page. 
  21.   if (!isset($_COOKIE[session_name()]) && $cache_enabled) { 
  22.     // Make sure there is a user object because its timestamp will be 
  23.     // checked, hook_boot might check for anonymous user etc. 
  24.     $user = drupal_anonymous_user(); 
  25.     // Get the page from the cache. 
  26.     $cache = drupal_page_get_cache(); 
  27.     // If there is a cached page, display it. 
  28.     if (is_object($cache)) { 
  29.       header('X-Drupal-Cache: HIT'); 
  30.       // Restore the metadata cached with the page. 
  31.       $_GET['q'] = $cache->data['path']; 
  32.       drupal_set_title($cache->data['title'], PASS_THROUGH); 
  33.       date_default_timezone_set(drupal_get_user_timezone()); 
  34.       // If the skipping of the bootstrap hooks is not enforced, call 
  35.       // hook_boot. 
  36.       if (variable_get('page_cache_invoke_hooks', TRUE)) { 
  37.         bootstrap_invoke_all('boot'); 
  38.       } 
  39.       drupal_serve_page_from_cache($cache); 
  40.       // If the skipping of the bootstrap hooks is not enforced, call 
  41.       // hook_exit. 
  42.       if (variable_get('page_cache_invoke_hooks', TRUE)) { 
  43.         bootstrap_invoke_all('exit'); 
  44.       } 
  45.       // We are done. 
  46.       exit
  47.     } 
  48.     else { 
  49.       header('X-Drupal-Cache: MISS'); 
  50.     } 
  51.   } 

当我们看到最下面,exit ;(We are done)之处,我们就知道,Drupal已经处理完了请求,后面的环境(Session、数据库、模块、FULL)等环节就不用启动了,因此大大节省了服务器的处理时间和提高了响应时间.

这就是Drupal自带的缓存处理机制,Drupal自带的缓存机制缺点也很明显,就是只对匿名用户有效.

因此,Authcache模块就出现了,Authcache就是利用Drupal自带的缓存机制,实现对登录用户的缓存.

继续看上面的代码,其中有3行,如下:

  1. foreach (variable_get('cache_backends'array()) as $include) { 
  2.   require_once DRUPAL_ROOT . '/' . $include

其中,获取’cache_backends’的时候,加载了一个数组变量,所以在Drupal自身的缓存阶段要使用到authcache,那就必须修改这个 cache_backends.

果如其然,如下所示,我们在安装authcache的时候,就必须设置如下变量.

  1. $conf['cache_backends'][] = 'sites/all/modules/authcache/authcache.cache.inc'
  2. $conf['cache_backends'][] = 'sites/all/modules/authcache/modules/authcache_builtin/authcache_builtin.cache.inc'

这个时候,我们就加载进了authcache.cache.inc和文件了.

继续…我们打开authcache.cache.inc 其中,就是定义一些函数,继续查看authcache_builtin.cache.inc文件,看到如下代码:

  1. $delivered = authcache_builtin_cacheinc_retrieve_cache_page(); 
  2. if ($delivered) { 
  3.   exit

也就是说在这个时候,如果命中了缓存就直接输入页面内容,不再继续boot!这个地方也就代替了原本Drupal自己查找缓存和计算命中缓存的逻辑,使用authcache自己的算法,根据用户的角色不同,使用的缓存不同.

这就是authcache的核心!

当然authcache还可以做更多,比如:

1. 根据用户不同,生产不同的缓存,需要处理.

2. 配合authcache_p13n模块,动态处理某些局部页面,比如某个block.

3. 修改缓存的某个些内容,稍后会详细讲解.

等等,这就是authcache比boost灵活的地方,当然也是缺点,需要调用很多PHP、数据库等等,肯定比boost慢一些.

Tags: Drupal缓存 Authcache缓存

分享到: