prepare_cache_updaters(); $config = Config::current(); $config->cache_exclude = (array) $config->cache_exclude; if (!empty($config->cache_exclude)) foreach ($config->cache_exclude as &$exclude) if (substr($exclude, 7) != "http://") $exclude = $config->url."/".ltrim($exclude, "/"); if(count((array)$config->cache_memcached_hosts) > 0){ $this->cacher = new MemCacher(self_url(), $config); }else{ $this->cacher = new FileCacher(self_url(), $config); } # Prepare actions that should result in new cache files. $this->prepare_cache_updaters(); } static function __install() { $config = Config::current(); $config->set("cache_expire", 1800); $config->set("cache_exclude", array()); $config->set("cache_memcached_hosts", array()); } static function __uninstall() { $config = Config::current(); $config->remove("cache_expire"); $config->remove("cache_exclude"); $config->remove("cache_memcached_hosts"); } public function route_init($route) { if (!empty($_POST) or !($route->controller instanceof MainController) or in_array($this->url, Config::current()->cache_exclude) or $this->cancelled or !$this->cacher->url_available() or Flash::exists()) return; $cache = $this->cacher->get($route); foreach($cache['headers'] as $header) header($header); exit($cache['contents']); } public function end($route) { if (!($route->controller instanceof MainController) or in_array($this->url, Config::current()->cache_exclude) or $this->cancelled or $this->cacher->url_available() or Flash::exists()) return; $this->cacher->set(ob_get_contents()); } public function prepare_cache_updaters() { $regenerate = array("add_post", "add_page", "update_post", "update_page", "delete_post", "delete_page", "change_setting"); Trigger::current()->filter($regenerate, "cacher_regenerate_triggers"); foreach ($regenerate as $action) $this->addAlias($action, "regenerate"); $post_triggers = array(); foreach (Trigger::current()->filter($post_triggers, "cacher_regenerate_posts_triggers") as $action) $this->addAlias($action, "remove_post_cache"); } public function regenerate() { $this->cacher->regenerate(); } public function regenerate_local($user = null) { $this->cacher->regenerate_local($user); } public function remove_caches_for($url) { $this->cacher->remove_caches_for($url); } public function remove_post_cache($thing) { $this->remove_caches_for(htmlspecialchars_decode($thing->post()->url())); } public function update_user($user) { $this->regenerate_local(sanitize($user->login)); } public function settings_nav($navs) { if (Visitor::current()->group->can("change_settings")) $navs["cache_settings"] = array("title" => __("Cache", "cacher")); return $navs; } public function admin_cache_settings($admin) { if (!Visitor::current()->group->can("change_settings")) show_403(__("Access Denied"), __("You do not have sufficient privileges to change settings.")); if (empty($_POST)) return $admin->display("cache_settings"); if (!isset($_POST['hash']) or $_POST['hash'] != Config::current()->secure_hashkey) show_403(__("Access Denied"), __("Invalid security key.")); $exclude = (empty($_POST['cache_exclude']) ? array() : explode(", ", $_POST['cache_exclude'])); $memcached_hosts = empty($_POST['cache_memcached_hosts']) ? array() : explode(", ", $_POST['cache_memcached_hosts']); $config = Config::current(); if ($config->set("cache_expire", $_POST['cache_expire']) and $config->set("cache_exclude", $exclude) and $config->set("cache_memcached_hosts", $memcached_hosts)) Flash::notice(__("Settings updated."), "/admin/?action=cache_settings"); } public function admin_clear_cache() { if (!Visitor::current()->group->can("change_settings")) show_403(__("Access Denied"), __("You do not have sufficient privileges to change settings.")); $this->regenerate(); Flash::notice(__("Cache cleared.", "cacher"), "/admin/?action=cache_settings"); } }