* @version $Id: cache.php,v 1.11 2013/04/26 15:09:35 andig2 Exp $ */ // define cache folder if (!defined('CACHE')) define('CACHE', 'cache'); /** * Get the hashed filename * * @param string url of the item * @param string $cache_folder name ob the sub-cache to adress * @param string ext file extension of the cache file */ function cache_get_filename($url, $cache_folder, $ext = '') { $hash = md5($url) . (($ext) ? '.'.$ext : ''); $cache_file = cache_get_folder($cache_folder, $hash) . $hash; return $cache_file; } /** * Get name of the cache folder * * @TODO decouple from global config options * * @param string $cache_folder name ob the sub-cache to adress * @param string $cache_filename name of the item to be cached for use with hierarchical caches * @return string cache folder path including trailing / */ function cache_get_folder($cache_folder, $cache_filename = '') { global $config; $cache_folder = CACHE.'/' . (($cache_folder) ? $cache_folder.'/' : ''); if ($cache_filename) $cache_folder .= substr($cache_filename, 0, @(int)$config['hierarchical']).'/'; return $cache_folder; } /** * Cleanup a single cache folder * * @param string $cache_folder path to cache folder * @param int $cache_max_age maximum age of cached items in seconds * @param bool $force_prune force cache pruning even if not due according to schedule */ function cache_prune_folder($cache_folder, $cache_max_age, $force_prune = false, $simulate = false, $pattern = '*') { if (!preg_match('#/$#', $cache_folder)) $cache_folder .= '/'; $stamp = $cache_folder.'cache_last_purge'; $cache_mtime = @filemtime($stamp); // get time the cache was last purged (once a day) // if cache was last purged a day or more ago if ($force_prune || ((time() - $cache_mtime) > ($cache_max_age / 24))) # 86400) { foreach (glob($cache_folder.$pattern, GLOB_NOSORT) as $file) { // avoid hidden files and directories if (is_file($file) &! preg_match("/^\./", $file) && time() - filemtime($file) > $cache_max_age) { if ($simulate) $files[] = $file; // add to list of potentially purged files else @unlink($file); // purge cache } } if ($simulate) return $files; @touch($stamp); // mark purge as having occurred return true; } return false; } /** * Cleanup a cache folder hierarchy * * @TODO decouple from global config options * * @param string $cache_folder path to cache folder * @param int $cache_max_age maximum age of cached items in seconds * @param bool $force_prune force cache pruning even if not due according to schedule */ function cache_prune_folders($cache_folder, $cache_max_age, $force_prune = false, $simulate = false, $pattern = '*', $levels = 0) { global $config; // root folder cache_prune_folder($cache_folder, $cache_max_age, $force_prune, $simulate, $pattern, $levels); // descent hierarchy if ($levels > 0) { if (!isset($error)) { $error = ''; } for ($i=0; $i<16; $i++) $error .= cache_prune_folders($cache_folder.dechex($i).'/', $cache_max_age, $force_prune, $simulate, $pattern, $levels-1); } } /** * Create cache folders * * Check individual cache folder for existance, check if folder is writable and create folder if it doesn't exist */ function cache_create_folders($dir, $levels = 0) { $error = ''; if (!is_dir($dir)) { if (!@mkdir($dir, 0700)) $error = 'Directory '.$dir.' does not exist.
'; } elseif (!is_writable($dir)) { $error = 'Directory '.$dir.' is not writable.
'; } // check hierarchical folders if (empty($error) && ($levels > 0)) { for ($i=0; $i<16; $i++) $error .= cache_create_folders($dir.'/'.dechex($i), $levels-1); } return $error; } /** * Verify existance of cached file for given url/ extension * * @author Andreas Goetz * @param string url of the item * @param string ext file extension of the cache file * @param string file result: URL to the cached image if exists * @return bool result of check */ function cache_file_exists($url, &$cache_file, $cache_folder, $ext = '') { $cache_file = cache_get_filename($url, $cache_folder, $ext); // Small performance fix $result = file_exists($cache_file) && filesize($cache_file); # $result = filesize($cache_file) > 0; return($result); } function cache_get($url, $cache_folder, $cache_max_age, $serialize = false) { $data = false; if ($cache_max_age > 0) { if (cache_file_exists($url, $cache_file, $cache_folder)) { if (time() - filemtime($cache_file) < $cache_max_age) { $data = file_get_contents($cache_file); if (($data !== false) && $serialize) $data = unserialize($data); } // TODO Check if outdated cache files should really be auto-deleted else @unlink($cache_file); } } return $data; } function cache_put($url, $data, $cache_folder, $cache_max_age, $serialize = false) { // only put file to cache if caching is enabled if ($cache_max_age > 0) { // get the cache file name $cache_file = cache_get_filename($url, $cache_folder); // commit to disk if ($serialize) $data = serialize($data); file_put_contents($cache_file, $data); } } ?>