Les templates PHP sont une mauvaise idée

Il y a probablement plus d'une centaine de moteurs de template en PHP (le plus connue étant Smarty). Les templates sont un bon concept : garder la présentation dans un fichier, et la logique applicative dans un autre (et le stockage dans un troisième endroit : la base de donnée). Utiliser un langage simple et facile pour les templates de sorte que n'importe quel infographiste ou amateur de HTML pourra s'en servir, et laisser les aspects complexes de la programmation à quelque chose et quelqu'un d'autre. Oui, les templates sont utiles avec Java, C#, Python ou n'importe quel langage. Sauf PHP.

Pourquoi donc ? Voilà un indice : PHP vient de "Hypertext Preprocessor". C'est à dire en clair un système de template HTML. Et de fait, PHP est bien un langage de template : il a été créé pour être simple et facile à utiliser, et pour permettre d'insérer directement son code dans une page HTML pour en contrôler l'aspect. Alors tout ces systèmes de template pour PHP ne font au final qu'un langage de template écrit avec un autre langage de template. Doh !

Prenons par exemple quelques lignes d'un template Smarty :

{$title}
{include file='header.tpl'}
{if $a}
Hello
{else}
Bye
{/if}

Et la même chose en PHP :

<?php
echo($title);
include('header.php');
if ($a)
echo('Hello');
else
echo('Bye');
?>

Vraiment, quel est l'intérêt de réinventer la roue ?

Les moteurs de template obligent à apprendre une nouvelle synthaxe, ralentisse le traitement (car il faut lire et analyser la template), et comme toute couche logicielle supplémentaire, augmente les chances de tomber sur un bug ou une faille de sécurité. Dès lors ils ne présentent un intérêt qu'avec les langages où la génération de HTML est lourde et pénible. Est-ce le cas avec PHP ? Certainement pas.

Bien sûr, il reste toujours utile de séparer la logique et la présentation. Mais on peu parfaitement le faire sans abandonner PHP : il suffit par exemple de mettre la présentation dans la page PHP principale et de placer la logique dans des fichiers externes. Ou à l'inverse, de stocker la présentation dans une template séparée écrite en PHP "classique. Ou bien les deux en mettant chaque chose dans un fichier distinct.

0 commentaire sur ce billet.

Grouper les fichiers pour gagner en vitesse

Dans mon premier billet sur l'optimisation de site Web j'évoquais la possibilité d'utiliser un script pour servir plusieurs fichiers Javascript (ou CSS) d'un coup pour gagner en vitesse. Voici un petit exemple de script PHP pour réaliser ce type de regroupement à la volée :

header('Cache-Control: max-age=3600, must-revalidate');
header('Content-type: text/javascript');
ob_start('ob_gzhandler');
if ($_REQUEST['f'])
{ $tab=explode(' ',trim($_REQUEST['f']));
foreach ($tab as $file)
if (preg_match('/^([0-9a-z_\-]+\/)*[0-9a-z_\-]+\.js$/i',$file)) readfile($file);
}

Le script est supposé être installé dans le répertoire où se trouvent les fichiers Javascript à servir. Ainsi, si vous avez 3 fichiers à regrouper ensemble vous pourriez utiliser une seule ligne HTML de la sorte :

<script src="/javascripts/script.php?f=file1.js+file2.js+file3.js" type="text/javascript"></script>

Quelques mots sur le code :

  1. La sortie est compressée avec ob_gzhandler. Ceci permet typiquement un gain de taille de 50 à 75% ce qui donne autant de temps gagné (et accessoirement de bande passante).
  2. Par sécurité, le paramètre d'entrée est vérifié pour n'autoriser que les fichiers .js.
  3. Des en-têtes HTTP sont rajoutés pour envoyer le bon type de fichier MIME ainsi qu'indiquer au navigateur de garder le résultat dans son cache pendant 1 heure (3600 secondes), permettant par là encore un gain de vitesse.

Il se trouve que Rakaz explore et développe la même idée, mais lui va plus loin en utilisant mod_rewrite pour présenter une URL plus lisible et qui cache le script de groupage.

0 commentaire sur ce billet.