From 6b4cfbcb5487845d277a74e0c7d384791b39a9de Mon Sep 17 00:00:00 2001 From: marcus Date: Fri, 5 Dec 2008 19:56:39 +0000 Subject: Prototype view caching git-svn-id: https://code.elgg.org/elgg/trunk@2510 36083f99-b078-4883-b0ff-0f9b5a30f544 --- engine/lib/elgglib.php | 110 ++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 105 insertions(+), 5 deletions(-) diff --git a/engine/lib/elgglib.php b/engine/lib/elgglib.php index 15b70711f..f0dd80dc4 100644 --- a/engine/lib/elgglib.php +++ b/engine/lib/elgglib.php @@ -153,6 +153,101 @@ return false; } + + /** + * Generate a view hash. + * + * @param string $view The view name + * @param array $vars The view parameters + * @return string The hash. + */ + function elgg_get_viewhash($view, $vars) + { + global $VIEW_CACHE_DISABLED, $CONFIG; + + if (($VIEW_CACHE_DISABLED) || (!$CONFIG->viewcache)) return false; + + $unchanged_vars = unserialize(serialize($vars)); + + // This is a bit of a hack, but basically we have to remove things that change on each pageload + if (isset($unchanged_vars['entity']->last_action)) $unchanged_vars['entity']->last_action = 0; + if (isset($unchanged_vars['entity']->prev_last_action)) $unchanged_vars['entity']->prev_last_action = 0; + + if (isset($unchanged_vars['user']->last_action)) $unchanged_vars['user']->last_action = 0; + if (isset($unchanged_vars['user']->prev_last_action)) $unchanged_vars['user']->prev_last_action = 0; + + + return md5(current_page_url() . $view . serialize($uncharged_vars)); // This should be enough to stop artefacts + + } + + /** + * Cache a view. + * + * @param string $view The content. + * @param string $content The content. + * @param string $viewhash The hash + * @return bool + */ + function elgg_cache_view($view, $content, $viewhash) + { + global $view_cache, $VIEW_CACHE_DISABLED, $CONFIG; + + if (($VIEW_CACHE_DISABLED) || (!$CONFIG->viewcache)) return false; + + // Cache + if ($viewhash) + { + error_log("MARCUS : Caching $view:$viewhash"); + $view_cache->save($viewhash, $content); + + return $viewhash; + } + + return false; + } + + /** + * Get a cached view based on its hash. + * + * @param string $viewhash + * @return string or false on if no cache returned. + */ + function elgg_get_cached_view($viewhash) + { + global $view_cache, $VIEW_CACHE_DISABLED, $CONFIG; + + if (($VIEW_CACHE_DISABLED) || (!$CONFIG->viewcache)) return false; + + if ((!$view_cache) && (is_memcache_available())) + $view_cache = new ElggMemcache('view_cache'); + if ($view_cache) { + + $cached_view = $view_cache->load($viewhash); + + if ($cached_view) + { + error_log("MARCUS : LOADED $view:$viewhash from cache"); + return $cached_view; + } + else + error_log("MARCUS : View $view:$viewhash not cached"); + + } + + return false; + } + + /** + * Temporarily disable view caching. + * + */ + function elgg_disable_view_cache() + { + global $VIEW_CACHE_DISABLED; + + $VIEW_CACHE_DISABLED = true; + } /** * Handles templating views @@ -210,14 +305,18 @@ } if (!isset($vars['js'])) { $vars['js'] = ""; - } - + } + // If it's been requested, pass off to a template handler instead if ($bypass == false && isset($CONFIG->template_handler) && !empty($CONFIG->template_handler)) { $template_handler = $CONFIG->template_handler; return $template_handler($view, $vars); } + // Attempt to memcache views. + /*$view_hash = elgg_get_viewhash($view, $vars); + $cached_view = elgg_get_cached_view($view_hash); + if ($cached_view) return $cached_view;*/ // Get the current viewtype $viewtype = elgg_get_viewtype(); @@ -251,9 +350,7 @@ error_log($view_location . "{$viewtype}/{$view}.php"); error_log(" [This view ({$view}) does not exist] "); } - - - + } // Save the output buffer into the $content variable @@ -261,6 +358,9 @@ // Plugin hook $content = trigger_plugin_hook('display','view',array('view' => $view),$content); + + // Cache view + //elgg_cache_view($view, $content, $view_hash); // Return $content return $content; -- cgit v1.2.3