Dans PHP, il y a des tonnes de fonctions qu’on n’utilise pas très souvent.
Ce soir, je vais vous montrer qu’on peu avec les fonctions de contrôle de sortie créer facilement un système de cache très simpliste.
Attention: Ce système de cache est loin d’être parfait, en fait, c’est surement le pire qu’on puisse coder: il est peut performant (car en PHP), non partagé, et devrait comporter un système de locking.
Voilà le code:
class SimpleCache
{
var $is_started = FALSE;
var $dir = '/tmp/cache';
public function __construct($auto_start = FALSE)
{
if(TRUE == $auto_start)
{
$this->startCache();
}
}
public function __destruct()
{
$this->endCache();
}
public function getCacheFileName()
{
$request_data = sha1(json_encode($_REQUEST));
$file_name = $this->dir . '/' . $request_data . '.cache';
return($file_name);
}
public function startCache()
{
$file_name = $this->getCacheFileName();
if(file_exists($file_name))
{
echo file_get_contents($file_name);
die();
}
ob_start();
$this->is_started = TRUE;
}
public function endCache()
{
$file_name = $this->getCacheFileName();
if(FALSE == $this->is_started)
return;
$contents = ob_get_contents();
$f = fopen($file_name, 'w+');
if($f)
{
fwrite($f, $contents);
fclose($f);
}
ob_end_flush();
}
}
Comment ça marche: A n’importe quel moment, on démarre le mécanisme du cache en appelant la fonction startCache. Celle ci va soit stocker en mémoire ce qu’il va afficher sur stdout avec ob_start, soit si le fichier de cache existe, ressortir le contenu. Ce fichier de cache sera différent à chaque type de requête car il doit son nom à la fonction getCacheFileName, qui calculera un nom unique à pour chaque requète différente. Il est évident que cela casse toute sorte de « dynanisme ».
A la fin du script, lors du garbage collector, ou alors dès que le développeur le veut, la fonction endCache est appelée. Celle ci va stocker dans un fichier la sortie du script, récupéré grâce à ob_get_contents depuis l’appel à startCache.
On pourra utiliser cette classe de cette façon:
require_once 'SimpleCache.class.php';
$cache = new SimpleCache( TRUE );
/* Code à cacher */
echo time();
Et voilà le résultat:
1290807633
$ sleep 5 ; lynx -dump http://localhost/cache/index.php
1290807633
$ ls /tmp/cache/
97d170e1550eee4afc0af065b78cda302a97674c.cache
$ cat /tmp/cache/97d170e1550eee4afc0af065b78cda302a97674c.cache
1290807633
Le résultat est bien caché dans /tmp/cache et récupéré à l’appel suivant comme désiré.