aboutsummaryrefslogtreecommitdiff
path: root/engine/lib/cache.php
diff options
context:
space:
mode:
Diffstat (limited to 'engine/lib/cache.php')
-rw-r--r--engine/lib/cache.php204
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;
+}