Rev 831 | Blame | Last modification | View Log | RSS feed
<?php////////////////////////////////////////////////////////////////////////////////// //// Copyright (C) 2006 Phorum Development Team //// http://www.phorum.org //// //// This program is free software. You can redistribute it and/or modify //// it under the terms of either the current Phorum License (viewable at //// phorum.org) or the Phorum License that was distributed with this file //// //// This program is distributed in the hope that it will be useful, //// but WITHOUT ANY WARRANTY, without even the implied warranty of //// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. //// //// You should have received a copy of the Phorum License //// along with this program. ///////////////////////////////////////////////////////////////////////////////////** Simple file-based caching-layer* Recommended are some more sophisticated solutions, like* memcached-, mmcache/eaccelerator-layer*/if(!defined("PHORUM")) return;/* Only load the caching mechanism if we have a cache directory configured. */if(!isset($PHORUM["cache"])) return;/* initializing our real cache-dir */$PHORUM['real_cache']=$PHORUM['cache']."/".md5(__FILE__);/** This function returns the cached data for the given key* or NULL if no data is cached for this key*/function phorum_cache_get($type,$key) {$partpath=$GLOBALS['PHORUM']['real_cache']."/".$type;if(is_array($key)) {$ret=array();foreach($key as $realkey) {$path=$partpath."/".wordwrap(md5($realkey), PHORUM_CACHE_SPLIT, "/", true)."/data.php";if(file_exists($path)){$retval=unserialize(file_get_contents($path));// the data is: array($ttl_time,$data)if($retval[0] < time()) { // timeoutunlink($path);} else {$ret[$realkey]=$retval[1];}unset($retval);}}} else {$path=$partpath."/".wordwrap(md5($key), PHORUM_CACHE_SPLIT, "/", true)."/data.php";if(!file_exists($path)){$ret=NULL;} else {$ret=unserialize(file_get_contents($path));// the data is: array($ttl_time,$data)if($ret[0] < time()) { // timeout$ret=NULL;unlink($path);} else {$ret=$ret[1];}}}if(is_array($ret) && count($ret) == 0) {$ret=NULL;}return $ret;}/** Puts some data into the cache* returns number of bytes written (something 'true') or false ...* depending of the success of the function*/function phorum_cache_put($type,$key,$data,$ttl=PHORUM_CACHE_DEFAULT_TTL) {$path=$GLOBALS['PHORUM']['real_cache']."/$type/".wordwrap(md5($key), PHORUM_CACHE_SPLIT, "/", true);if(!file_exists($path)){phorum_cache_mkdir($path);}$file=$path."/data.php";$ttl_time=time()+$ttl;$fp=fopen($file,"w");$ret=fwrite($fp,serialize(array($ttl_time,$data)));fclose($fp);return $ret;}/** Removes a key from the cache*/function phorum_cache_remove($type,$key) {$ret =true;$path=$GLOBALS['PHORUM']['real_cache']."/$type/".wordwrap(md5($key), PHORUM_CACHE_SPLIT, "/", true)."/data.php";if(file_exists($path)) {$ret=unlink($path);}return $ret;}/** Clears all data from the cache*/function phorum_cache_clear() {$dir = $GLOBALS['PHORUM']['real_cache'];$ret = false;if(!empty($dir) && $dir != "/") {phorum_cache_rmdir($dir);}return $ret;}/*type can be nearly each value to specify a group of dataused are currently:'user'*/// helper functions// recursively deletes all files/dirs in a directory// recursively creates a directory-treefunction phorum_cache_mkdir($path) {if(empty($path)) return false;if(is_dir($path)) return true;if (!phorum_cache_mkdir(dirname($path))) return false;mkdir($path);return true;}// recursively deletes all files/dirs in a directoryfunction phorum_cache_rmdir( $path ) {$stack[]=$path;$dirs[]=$path;while(count($stack)){$path=array_shift($stack);$dir = opendir( $path ) ;while ( $entry = readdir( $dir ) ) {if ( is_file( $path . "/" . $entry ) ) {unlink($path."/".$entry);} elseif ( is_dir( $path . "/" . $entry ) && $entry != '.' && $entry != '..' ) {array_unshift($dirs, $path . "/" . $entry) ;$stack[]=$path . "/" . $entry ;}}closedir( $dir ) ;}foreach($dirs as $dir){rmdir($dir);}return;}?>