1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
| <?php
/**
* Classe de mise en cache du contenu.
*/
class Cache {
var $cache_base = 'temp/cache/';
/**
* Constructeur
* @param int $dureeCache Durée du cache en secondes
*/
function Cache( $dureeCache = 3600 )
{
global $cache_content, $cache_file;
$this->file = str_replace( '/home/chemin/jusqu/au/www/', '', $_SERVER['SCRIPT_FILENAME'] ); // Exemple de contenu : mon/dossier/script.php
$this->dureeCache = $dureeCache;
$this->cache_file = '/home/chemin/jusqu/au/www/' . $this->cache_base . $this->file;
register_shutdown_function( 'call_user_func', array( get_class( $this ), 'genCache_onExit' ) );
mkpath( $this->cache_file );
// Retourne le cache si possible
$this->cache_use();
$cache_file = $this->cache_file;
// Commence la bufferisation pour la mise en cache
ob_start( create_function( '$buffer',
'global $cache_content;
$cache_content = $buffer;'
)
);
}
/**
* Génère le cache dans le cas où le script s'est bien déroulé.
*/
function genCache_onExit()
{
global $cache_content, $cache_file;
ob_end_flush(); // Arrête la bufferisation en PHP5 (qui ne se termine pas à la fin du script à cause de la fonction de rappel sans return dans ob_start())
// Si le script s'est bien terminé, on crée le cache
if ( $GLOBALS['EOS'] ) {
echo $cache_content;
file_put_contents( $cache_file, $cache_content );
}
}
/**
* Vérifie si le cache est disponible et l'affiche le cas échéant.
*/
function cache_use()
{
clearstatcache();
// Renvoie le contenu du cache s'il existe et qu'il n'est pas périmé
if ( file_exists( $this->cache_file ) && time() - filemtime( $this->cache_file ) < $this->dureeCache )
{
readfile( $this->cache_file );
exit();
}
}
}
/**
* Crée une arborescence (vérifie son existence).
* @param string $path Chemin à créer
*/
function mkpath( $path )
{
$path_pieces = explode( '/', $path );
array_pop( $path_pieces ); // Supprime le nom du fichier
$path = '';
while ( !is_null( $piece = array_shift( $path_pieces ) ) ) {
$path .= $piece . '/';
if ( !is_dir( $path ) ) {
umask( 0 );
mkdir( $path, 0777 );
}
}
}
?> |
Partager