Il s'agit de l'un des nouveaux fers de lance de Google, mais au delà de ça c'est un problème de sens commun : plus une page est rapide à s'afficher, moins le visiteur patiente et plus il est heureux.

Même si on peut difficilement influer sur certains paramètres (comme le délai de connexion à l'hôte), on peut minimiser l'appel de fonctions lourdes en les délocalisant à la fin du script. Pas besoin de copier coller un à un les appels de fonction en bas de page, non seulement cela est inutile (il est très probable que vous ayez une page footer. php qui renverra encore du code, ruinant votre tentative d'accélérer la fin de page) mais en plus cela ne facilite pas la maintenance du code.

En fait, PHP met à votre disposition une « méta-fonction » qui permet de paramétrer des appels à d'autres fonctions en fin de script. Son nom ? register_shutdown_function(). Dans la suite de l'article, nous verrons un exemple d'utilisation…

Tout d'abord, la syntaxe. register_shutdown_function() prend un seul paramètre obligatoire, un callback (le string du nom de la fonction). Les autres paramètres (optionnels) peuvent être utilisés pour passer des arguments à la fonction de callback.

Petit exemple basique : à certains endroits de votre script, vous devez envoyer un mail. Malheureusement, certains serveurs mettent près de 5 secondes à accepter le nouveau mail, un délai inacceptable surtout s'il est répété de multiples fois dans la page…
La solution va donc consister à retarder l'envoi réel du mail en enregistrant l'appel à la fonction.

Prenons donc la fonction classique d'envoi de mail :

//********************************************
//Permet l'envoi d'un mail via une fonction simple.
//********************************************
function envoimailReel($to,$subject,$message)
{
	// Pour envoyer un mail HTML, l'en-tête Content-type doit être défini
	$headers  = 'MIME-Version: 1.0' . "\r\n";
	$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";

	// En-têtes additionnels
	$headers .= 'From: Auteur ' . "\r\n";//Spécifier l'expéditeur pour avoir un lien de retour valide

	mail($to, $subject, $message, $headers);//Envoyer le mail
}

Nous allons la diviser en deux parties : la première qui enregistrera la référence, et la seconde appelée à la fin qui enverra réellement le mail.

//********************************************
//Permet l'envoi d'un mail via une fonction simple. Les mails ne sont envoyés qu'à la fin de l'exécution du script pour éviter les ralentissements.
//********************************************
function envoimail($to,$subject,$message)
{
	//Ajouter à la pile de sortie.
	register_shutdown_function("envoimailDiffere",$to,$subject,$message);
}

//La vraie fonction, qui ne devrait pas être appelée dans le script.
function envoimailDiffere($to,$subject,$message)
{
	// Pour envoyer un mail HTML, l'en-tête Content-type doit être défini
	$headers  = 'MIME-Version: 1.0' . "\r\n";
	$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";

	// En-têtes additionnels
	$headers .= 'From: Auteur ' . "\r\n";//Spécifier l'expéditeur pour avoir un lien de retour valide

	mail($to, $subject, $message, $headers);//Envoyer le mail
}

Attention cependant ! Si l'utilisateur interrompt la connexion avant la fin de page (en cliquant sur le bouton stop du navigateur), le script PHP est normalement arrêté. Il faut donc inhiber ce comportement s'il s'agit de mails importants en utilisant la fonction ignore_user_abort(true) (à mettre en début de script, ou à l'intérieur de la fonction envoiMail).

L'utilisation de register_shutdown_function() ne se limite pas forcément à l'envoi de mails, et on peut imaginer tout un tas d'applications utiles : téléchargements de pages, optimisations de base de données... the only limit is your imagination.