这应该是一个非常简单的问题,但我发现很难找到答案。
我正在使用具有静态内容和动态方面的hook_menu创建自定义页面(主要来自sql查询和视图嵌入等...)。我的问题是,drupal的缓存系统如何处理这些自定义页面?
我很担心,因为随着流量在某些情况下增加,我觉得我需要对这些页面的显示进行某种缓存控制,但此时,我不知道它们是否会被自动缓存,或者如果我需要以某种方式指定drupal我确实希望它们被缓存。
为了澄清,这些页面不是管理页面,但任何人都可以访问。
答案 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查询获取输出数据,则可以缓存查询结果。