Subversion Repositories Applications.papyrus

Compare Revisions

Ignore whitespace Rev 830 → Rev 831

/trunk/client/phorum/bibliotheque/phorum/include/cache.php
New file
0,0 → 1,176
<?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()) { // timeout
unlink($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 data
used are currently:
'user'
*/
 
// helper functions
 
// recursively deletes all files/dirs in a directory
 
// recursively creates a directory-tree
function 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 directory
function 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;
}
 
?>