diff options
| author | ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544> | 2011-02-15 01:11:03 +0000 | 
|---|---|---|
| committer | ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544> | 2011-02-15 01:11:03 +0000 | 
| commit | 9af0f9be12346d2008cf6de6e5ab7bd083c09c8c (patch) | |
| tree | d9c4185482b16fb50dcd9df5d20f6cc3fd76a219 /engine/lib/cache.php | |
| parent | 9ce11d138f9868b872fe8206dbc3c2f44723605a (diff) | |
| download | elgg-9af0f9be12346d2008cf6de6e5ab7bd083c09c8c.tar.gz elgg-9af0f9be12346d2008cf6de6e5ab7bd083c09c8c.tar.bz2 | |
Fixes #2920: Moved simplecache functions into cache.php
git-svn-id: http://code.elgg.org/elgg/trunk@8248 36083f99-b078-4883-b0ff-0f9b5a30f544
Diffstat (limited to 'engine/lib/cache.php')
| -rw-r--r-- | engine/lib/cache.php | 204 | 
1 files changed, 204 insertions, 0 deletions
| diff --git a/engine/lib/cache.php b/engine/lib/cache.php index 72293022a..1f24cddd1 100644 --- a/engine/lib/cache.php +++ b/engine/lib/cache.php @@ -7,6 +7,8 @@   * @subpackage Cache   */ +/* Filepath Cache */ +  /**   * Returns an ElggCache object suitable for caching view   * file load paths to disk under $CONFIG->dataroot. @@ -112,3 +114,205 @@ function elgg_disable_filepath_cache() {  	$CONFIG->viewpath_cache_enabled = 0;  	elgg_filepath_cache_reset();  } + +/* Simplecache */ + +/** + * Registers a view to simple cache. + * + * Simple cache is a caching mechanism that saves the output of + * views and its extensions into a file.  If the view is called + * by the {@link simplecache/view.php} file, the Elgg framework will + * not be loaded and the contents of the view will returned + * from file. + * + * @warning Simple cached views must take no parameters and return + * the same content no matter who is logged in. + * + * @note CSS and the basic JS views are cached by the engine. + * + * @param string $viewname View name + * + * @return void + * @link http://docs.elgg.org/Views/Simplecache + * @see elgg_view_regenerate_simplecache() + */ +function elgg_view_register_simplecache($viewname) { +	global $CONFIG; + +	if (!isset($CONFIG->views)) { +		$CONFIG->views = new stdClass; +	} + +	if (!isset($CONFIG->views->simplecache)) { +		$CONFIG->views->simplecache = array(); +	} + +	$CONFIG->views->simplecache[] = $viewname; +} + +/** + * Get the URL for the cached file + * + * @param string $type The file type: css or js + * @param string $view The view name + * @return string + * @since 1.8.0 + */ +function elgg_view_get_simplecache_url($type, $view) { +	global $CONFIG; +	$lastcache = (int)$CONFIG->lastcache; + +	if (elgg_view_is_simplecache_enabled()) { +		$viewtype = elgg_get_viewtype(); +		$url = elgg_get_site_url() . "cache/$type/$view/$viewtype/$view.$lastcache.$type"; +	} else { +		$url = elgg_get_site_url() . "pg/$type/$view.$lastcache.$type"; +	} +	return $url; +} + +/** + * Regenerates the simple cache. + * + * @warning This does not invalidate the cache, but actively resets it. + * + * @param string $viewtype Optional viewtype to regenerate + * + * @return void + * @see elgg_view_register_simplecache() + */ +function elgg_view_regenerate_simplecache($viewtype = NULL) { +	global $CONFIG; + +	if (!isset($CONFIG->views->simplecache) || !is_array($CONFIG->views->simplecache)) { +		return; +	} + +	$lastcached = time(); + +	// @todo elgg_view() checks if the page set is done (isset($CONFIG->pagesetupdone)) and +	// triggers an event if it's not. Calling elgg_view() here breaks submenus +	// (at least) because the page setup hook is called before any +	// contexts can be correctly set (since this is called before page_handler()). +	// To avoid this, lie about $CONFIG->pagehandlerdone to force +	// the trigger correctly when the first view is actually being output. +	$CONFIG->pagesetupdone = TRUE; + +	if (!file_exists($CONFIG->dataroot . 'views_simplecache')) { +		mkdir($CONFIG->dataroot . 'views_simplecache'); +	} + +	if (isset($viewtype)) { +		$viewtypes = array($viewtype); +	} else { +		$viewtypes = $CONFIG->view_types; +	} + +	$original_viewtype = elgg_get_viewtype(); + +	foreach ($viewtypes as $viewtype) { +		elgg_set_viewtype($viewtype); +		foreach ($CONFIG->views->simplecache as $view) { +			$viewcontents = elgg_view($view); +			$viewname = md5(elgg_get_viewtype() . $view); +			if ($handle = fopen($CONFIG->dataroot . 'views_simplecache/' . $viewname, 'w')) { +				fwrite($handle, $viewcontents); +				fclose($handle); +			} +		} + +		datalist_set("simplecache_lastupdate_$viewtype", $lastcached); +		datalist_set("simplecache_lastcached_$viewtype", $lastcached); +	} + +	elgg_set_viewtype($original_viewtype); + +	// needs to be set for links in html head +	$CONFIG->lastcache = $lastcached; + +	unset($CONFIG->pagesetupdone); +} + +/** + * Is simple cache enabled + * + * @return bool + * @since 1.8.0 + */ +function elgg_view_is_simplecache_enabled() { +	global $CONFIG; + +	if ($CONFIG->simplecache_enabled) { +		return true; +	} + +	return false; +} + +/** + * Enables the simple cache. + * + * @access private + * @see elgg_view_register_simplecache() + * @return void + */ +function elgg_view_enable_simplecache() { +	global $CONFIG; + +	datalist_set('simplecache_enabled', 1); +	$CONFIG->simplecache_enabled = 1; +	elgg_view_regenerate_simplecache(); +} + +/** + * Disables the simple cache. + * + * @warning Simplecache is also purged when disabled. + * + * @access private + * @see elgg_view_register_simplecache() + * @return void + */ +function elgg_view_disable_simplecache() { +	global $CONFIG; +	if ($CONFIG->simplecache_enabled) { +		datalist_set('simplecache_enabled', 0); +		$CONFIG->simplecache_enabled = 0; + +		// purge simple cache +		if ($handle = opendir($CONFIG->dataroot . 'views_simplecache')) { +			while (false !== ($file = readdir($handle))) { +				if ($file != "." && $file != "..") { +					unlink($CONFIG->dataroot . 'views_simplecache/' . $file); +				} +			} +			closedir($handle); +		} +	} +} + +/** + * Invalidates all cached views in the simplecache + * + * @return bool + * @since 1.7.4 + */ +function elgg_invalidate_simplecache() { +	global $CONFIG; + +	$return = TRUE; + +	if ($handle = opendir($CONFIG->dataroot . 'views_simplecache')) { +		while (false !== ($file = readdir($handle))) { +			if ($file != "." && $file != "..") { +				$return = $return && unlink($CONFIG->dataroot . 'views_simplecache/' . $file); +			} +		} +		closedir($handle); +	} else { +		$return = FALSE; +	} + +	return $return; +} | 
