Compression GZ, log, cache, tout en un.
Posté : 04 avr. 2008, 16:53
J'ai un petit script sympa la, dont l'utilisation est fort simple, qui permet, directement, d'ajouter des fonctionnalités de compression, de cache, d'entregistrement, ou tout ce que vous voulez, à votre script.
Pour faire simple, j'utilise le buffer de sortie, lié à des observateurs, pour gérer la sortie du script.
Voilà l'objet principal:
La magie après, ce sont les observateurs qu'on peut lier.
Voici leur interface (pour faire propre):
C'est loin d'être parfait, les observateurs ne peuvent pas être enlevés, le cache ne vérifie pas la mise à jour de la page, mais ça fonctionne, libre à vous de l'utiliser et de le modifier (et de faire coucou).
(pour l'utiliser, il suffit de coller le code des classes et l'interface dans un fichier, l'inclure dans votre script, et initialiser le tout (attraper une instance, et ajouter les observateurs) en début de script. Le reste se fait tout seul).
Pour faire simple, j'utilise le buffer de sortie, lié à des observateurs, pour gérer la sortie du script.
Voilà l'objet principal:
class output
{
private static $instance;
public $observers;
private $method;
/*
* Partie fonctionnement, construction et destruction du machin.
*/
private function __construct($method)
{
ob_start();
$this->method = $method;
}
public static function get_instance($method)
{
if (!isset(self::$instance))
{
$temp = __CLASS__;
self::$instance = new $temp($method);
}
return self::$instance;
}
function __destruct()
{
switch ($this->method)
{
case "clean" :
$this->callback(ob_get_clean());
break;
case "get" :
default:
$this->callback(ob_get_contents());
}
}
function callback($data)
{
$this->notify($data);
//return $data;
return'';
}
/* --------------------
* Partie observateurs.
*/
function notify($data)
{
foreach ($this->observers as $obs)
{
$obs->notify($data);
}
}
function add($obs)
{
$this->observers[]=$obs;
}
}
Pour le lancer, il suffit d'en demander l'instance (c'est un singleton) en début de script:
$gestion_sortie=output::get_instance("clean");
(le paramètre ne sert pas a grand chôse. J'utilise le script en CLI aussi, et le tampon est géré différemment)La magie après, ce sont les observateurs qu'on peut lier.
Voici leur interface (pour faire propre):
interface observer
{
function notify($data);
}
Voici par exemple celui pour compresser la page:
class gzip implements observer
{
private $gz_ok = false;
function __construct()
{
if (strstr($_SERVER['HTTP_USER_AGENT'], 'W3C_Validator')===false ||
strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')!==false )
{
$this->gz_ok=true;
}
}
function notify($data)
{
if (!$this->gz_ok || strlen($data)<2000)
{
echo $data;
}
else
{
//echo strlen($data);
header("Content-Encoding: gzip");
echo gzencode($data);
}
}
}
Qui se crée et s'ajoute tout simplement:
$out_gz = new gzip();
$gestion_sortie->add($out_gz);
Ou encore celui qui s'occupe du cache (APC):
class little_cache implements observer
{
private $id;
function __construct($id)
{
if ($cach = apc_fetch($id))
{
echo $cach;
exit;
}
$this->id = $id;
}
function notify($data)
{
if (!apc_fetch($this->id))
apc_store($this->id,$data);
}
}
La différence, c'est qu'il nécessite un moyen d'identifier la page:
$l_cache = new little_cache(md5( $_SERVER["REQUEST_URI"]));
$gestion_sortie->add($l_cache);
Après, vous ajoutez ce que vous voulez comme observateur. Il sera appelé avec en paramètre le contenu de la page a afficher.C'est loin d'être parfait, les observateurs ne peuvent pas être enlevés, le cache ne vérifie pas la mise à jour de la page, mais ça fonctionne, libre à vous de l'utiliser et de le modifier (et de faire coucou).
(pour l'utiliser, il suffit de coller le code des classes et l'interface dans un fichier, l'inclure dans votre script, et initialiser le tout (attraper une instance, et ajouter les observateurs) en début de script. Le reste se fait tout seul).