首页 > 网站 > 建站经验 > 正文

Drupal的模块高级应用之Authcache-动态加载内容教程

2024-08-30 19:06:43
字体:
来源:转载
供稿:网友

网站为了提高性能,一般会采用缓存,Drupal中可以实现游客缓存,如果装上Authcache模块可以加速用户登录响应,对不同的role进行动态加载缓存,以下是教程详细过程.

本文讲一下如果通过修改authcache的核心代码,来实现缓存页面的个性化内容,通用的缓存,或多或少都是要进行个性化处理的,比如用户名显示、动态加载用户资料、用户好友等等.

一般情况下,这种局部个性化,都是通过两种手段实现:一个是SSI,另一个是CSI.

Authcache本身可以实现局部personalization,模块叫p13n.

Authcache的ajax模块属于CSI,ESI模块应该是属于SSI,但是由于ESI模块需要搭建varnish服务器,配置VCL,加上服务器的设置问题,会导致ESI容易出错,并且本身ESI传递cookie也会有些问题,因此ESI实际上实现起来相当复杂.

所以,如果我们要使用服务器端的personalization,通过PHP修改根据某些条件修改某些内容的话,需要hack一些authcache的代码.

1.autcache.module文件

找到下面一句,Line 188

// Invoke cache backends and serve page.

修改成如下代码:

  1. // Invoke cache backends and serve page. 
  2.  if (authcache_page_is_cacheable()) { 
  3.    $cache = authcache_backend_cache_save(); 
  4.    authcache_serve_page_from_cache($cache, authcache_key()); 
  5.  } 
  6.  else { 
  7.    ////process html result 
  8.    global $conf
  9.    $conf['page_compression'] = FALSE; 
  10.  
  11.    $cache = new stdClass(); 
  12.  
  13.    ////process html result 
  14.    $cache->data['body'] = ob_get_contents(); 
  15.    ob_clean(); 
  16.  
  17.    foreach (variable_get('authcache_page_process'array()) as $include) {  //开源软件:Vevb.com 
  18.      require_once DRUPAL_ROOT . '/' . $include
  19.    } 
  20.    foreach (variable_get('authcache_page_process_interface'array()) as $process) { 
  21.      require_once DRUPAL_ROOT . '/' . $include
  22.      if (is_callable($process)) { 
  23.        $process($cache); 
  24.      } 
  25.    } 
  26.    echo $cache->data['body']; 
  27.  } 
  28.  exit

其中,主要是加了else后面的处理代码.

2.authcache.cache.inc文件,从85行开始,到函数结尾,修改成如下格式.

  1. $return_compressed = FALSE; ///NEW //Don't send compressed content 
  2.  
  3. if ($page_compression) { 
  4.   header('Vary: Accept-Encoding', FALSE); 
  5.   // If page_compression is enabled, the cache contains gzipped data. 
  6.   if ($return_compressed) { 
  7.     // $cache->data['body'] is already gzip'ed, so make sure 
  8.     // zlib.output_compression does not compress it once more. 
  9.     ini_set('zlib.output_compression''0'); 
  10.     header('Content-Encoding: gzip'); 
  11.   } 
  12.   else { 
  13.     // The client does not support compression, so unzip the data in the 
  14.     // cache. Strip the gzip header and run uncompress. 
  15.     $cache->data['body'] = gzinflate(substr(substr($cache->data['body'], 10), 0, -8)); 
  16.   } 
  17.  
  18. ///NEW 
  19. foreach (variable_get('authcache_page_process'array()) as $include) { 
  20.   require_once DRUPAL_ROOT . '/' . $include
  21. foreach (variable_get('authcache_page_process_interface'array()) as $process) { 
  22.   if (is_callable($process)) { 
  23.     $process($cache); 
  24.   } 

注意:有两个地方,///NEW 标注,表示新加的内容,中间有一段是原有的code.

改完之后,我们就完工了.

如何使用呢?新建一个文件,比如在custom模块下面,叫custom_authcache.inc,黏贴如下代码:

  1. <?php 
  2. /** 
  3. Add the following lines to settings.php 
  4.  
  5. $conf['authcache_page_process'][] = 'sites/all/modules/custom/custom/custom_authcache.inc'; 
  6. $conf['authcache_page_process_interface'][] = 'custom_authcache_common_process'; 
  7.  
  8. If you want to add more process interface, add your function name as an item in this array, $conf['authcache_page_process_interface']. 
  9. If you want to include file, please add file name to this array, $conf['authcache_page_process'] 
  10.  
  11. Core Changes: 
  12. modules/authcache/authcache.cache.inc 
  13. modules/authcache/authcache.module 
  14. **/ 
  15.  
  16. /* 
  17. * Process authcache content to replace content 
  18. */ 
  19. function custom_authcache_common_process(&$cache) { 
  20.   $cache->data['body'] = str_ireplace('<span id="replace_placeholder_1"/>', _get_real_data(), $cache->data['body']); 
  21. ?> 

看上面的注释,复制两行代码到settings.php文件,具体的说明注释已经很详细了,相信应该没问题.

这样,这个custom_authcache_common_process函数就可以动态替换HTML里面的内容了,达到了个性化页面的目的.

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表