PHP possède un mécanisme qui permet d'intercepter le contenu qui serait normalement envoyé vers la sortie standard et qui le place dans une mémoire tampon pour pouvoir contrôler le flux de sortie. C'est ce qu'on appelle du "output buffering" (OB). Autrement dit, plutôt que d'envoyer le contenu vers le fureteur de l'utilisateur, il est temporairement mis de côté pour qu'on puisse le modifier et choisir à quel moment l'afficher.
À titre d'exemple, on voit souvent cette technique utilisée dans la construction de gabarits (templates) ou le caching de pages. Par exemple, le fichier body.tpl pourrait servir de gabarit où trois placeholders sous forme de commentaires (identificateur unique, prénom et emploi) pourront être remplacés à l'exécution.
body.tpl
<h3>Profil #<!-- ID--></h3><div>Pour mieux comprendre ce qui se passe, il faut savoir que le OB est actif à partir du moment qu'on appelle ob_start() et qu'il prend fin à l'appel de ob_end_clean() ou de ob_end_flush(). Toutes les lignes qui se trouveront entre ces deux appels seront assujetties à la mémoire tampon.
Mon nom est <!-- FirstName --> et je suis <!-- JobTitle -->.
</div>
// Démarrer la mémoire tampon.Toutes les instructions suivantes enverront leur contenu en sortie vers la mémoire tampon.
// À partir d'ici, tout ce qui serait normalement envoyé à la sortie standard
// sera conservé temporairement dans la mémoire tampon
ob_start();
// inclure des fichiers externesÀ partir d'ici, le tampon est garnit et nous avons deux possibilités :
include('templates/header.tpl');
include('templates/body.tpl');
// impression de contenu
echo 'Généré le ' . date('Y-m-d H:i:s');
// lecture de fichier
$footerFile = 'templates/footer.tpl';
if (file_exists($footerFile)) {
// envoyé aussi au tampon
readfile($footerFile);
}
- afficher immédiatement le contenu à l'aide de flush()
- récupérer le contenu dans une variable avec ob_get_contents() et y apporter des modifications avant de l'envoyer à la sortie
// récupération de la mémoire tampon dans la variableAvec le contenu de la variable $output, on pourrait :
$output = ob_get_contents();
// Nous n'avons plus besoin du tampon
// Nettoyer sans envoyer son contenu au fureteur
ob_end_clean();
// remplacer les placeholders
$id = 1000;
$output = str_replace('<!-- ID-->', $id, $output);
$output = str_replace('<!-- FirstName -->', 'Code 18', $output);
$output = str_replace('<!-- JobTitle-->', 'programmeur PHP', $output);
1. Envoyer le contenu directement au fureteur
echo $output;2. Créer un fichier HTML statique (en supposant que vous avez les permissions d'écriture sur le serveur) :
$file = fopen ("static/profil-$id.html", 'w');Dans php.ini, vous devrez vous assurer que la variable output_buffering n'a pas la valeur "off". Elle peut soit être à "on" (1), soit à un nombre limité de bytes pour améliorer la performance, par exemple 4096. Comme l'instruction PHP ini_set() ne peut être appelée dans ce contexte, une alternative serait de placer la ligne php_value output_buffering 4096 dans le fichier local .htaccess.
fwrite($file, $output);
fclose($file);