Voici un petit tutoriel pour expliquer comment – très simplement – mettre une page dynamique en cache pour en accélérer l’affichage et limiter les ressources côté serveur (apache et mysql).

Premièrement, suffit de créer deux fonctions. La première – debut_cache() – testera l’existence d’un fichier cache récent pour l’affichier, ou initialisera le buffer et débutera la mise en cache du contenu. La deuxième – fin_cache() – prend le contenu mis dans le buffer et va, suivant le besoin, écrire un fichier statique avec le contenu généré par le serveur qui sera alors repris par les requêtes suivants jusqu’à son expiration.

function debut_cache()
{
	global $cachedFile;
	if(CACHE > 0) {
		if (!isset($_POST) || count($_POST) == 0) {
			$hash = md5(serialize($_GET) . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
			$filename = basename($_SERVER['PHP_SELF'] . '.' . $_SERVER['HTTP_HOST'] . '.' . $hash . '.html');
			if (file_exists(CACHE_DIR . $filename) AND (time() - filemtime(CACHE_DIR. $filename)) < CACHE) {
				readfile(CACHE_DIR . $filename);
				exit();
			} else {
				$cachedFile = CACHE_DIR . $filename;
				ob_start();
			}
		} else $cachedFile = false;
	}
}
function fin_cache()
{
	global $cachedFile;
	if((CACHE > 0) AND $cachedFile) {
		$hoststr= getenv("HOSTNAME");
		$host = explode (".", $hoststr);
		$page = ob_get_contents();
		$page .= '<!-- Page mise en cache @ ' . date('Y-m-d H:i:s') . ' -->';
		ob_end_flush();
		if ($file = fopen($cachedFile, 'w')) {
    			fwrite($file, $page);
    			fclose($file);
    		}
	}
}

Juste avant de faire l’appel, il importe de définir deux variables (des constantes globales dans cet exemple).

//temps pour le cache (secondes)... 0 pour annuler la cache
define('CACHE', 60*15);  //15 min

//dossier de cache
define('CACHE_DIR', '/www/cache/');

Ensuite, on se lance :

//lancer la mise en cache
debut_cache();
//---------------------------------------------
//afficher normalement votre page ici
//elle sera mise dans le buffer
//---------------------------------------------

//afficher le contenu (du buffer ou du fichier mis en cache)
fin_cache();

Commentaires Facebook

1 Tweet

Un commentaire pour “Mise en cache de pages dynamiques”

Ajouter un commentaire

Additional comments powered by BackType

Twitter @emilegirard

RSS Liens partagés

Mots-clefs

Ailleurs

Méta