模块创建页面 - 缓存?

时间:2010-08-03 18:58:33

标签: drupal-6

这应该是一个非常简单的问题,但我发现很难找到答案。

我正在使用具有静态内容和动态方面的hook_menu创建自定义页面(主要来自sql查询和视图嵌入等...)。我的问题是,drupal的缓存系统如何处理这些自定义页面?

我很担心,因为随着流量在某些情况下增加,我觉得我需要对这些页面的显示进行某种缓存控制,但此时,我不知道它们是否会被自动缓存,或者如果我需要以某种方式指定dr​​upal我确实希望它们被缓存。

为了澄清,这些页面不是管理页面,但任何人都可以访问。

1 个答案:

答案 0 :(得分:1)

仅当菜单回调返回输出时才会缓存菜单回调的结果;当菜单回调打印输出时,它不会被缓存。

请求页面时执行引导Drupal的代码如下:

require_once './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

$return = menu_execute_active_handler();

// Menu status constants are integers; page content is a string.
if (is_int($return)) {
  switch ($return) {
    case MENU_NOT_FOUND:
      drupal_not_found();
      break;
    case MENU_ACCESS_DENIED:
      drupal_access_denied();
      break;
    case MENU_SITE_OFFLINE:
      drupal_site_offline();
      break;
  }
}
elseif (isset($return)) {
  // Print any value (including an empty string) except NULL or undefined:
  print theme('page', $return);
}

drupal_page_footer();

drupal_page_footer()是缓存结果的函数。

function drupal_page_footer() {
  if (variable_get('cache', CACHE_DISABLED) != CACHE_DISABLED) {
    page_set_cache();
  }

  module_invoke_all('exit');
}

page_set_cache()是完成实际工作的功能。

function page_set_cache() {
  global $user, $base_root;

  if (!$user->uid && $_SERVER['REQUEST_METHOD'] == 'GET' && page_get_cache(TRUE)) {
    // This will fail in some cases, see page_get_cache() for the explanation.
    if ($data = ob_get_contents()) {
      if (variable_get('page_compression', TRUE) && extension_loaded('zlib')) {
        $data = gzencode($data, 9, FORCE_GZIP);
      }
      ob_end_flush();
      cache_set($base_root . request_uri(), $data, 'cache_page', CACHE_TEMPORARY, drupal_get_headers());
    }
  }
}

压缩内容(如果启用zlib),并保存在缓存中。

如果您希望缓存是自定义菜单回调的输出,那么您只需要返回输出,而不是直接打印它。

function mymodule_callback() {
  // …
  return $output;
}

您可以缓存模块用于构建其输出的数据,而不是缓存页面的输出。例如,如果使用SQL查询获取输出数据,则可以缓存查询结果。