Utiliser Google Closure en PHP
ARCHIVE
Tout d'abord, qu'est-ce que Google Closure ?
Avant qu'un fichier javascript ne soit interprété, il faut, bien entendu, qu'il soit téléchargé. Plus le fichier est lourd, plus son chargement est long (logique). Or, en remplaçant simplement des noms de variables (par exemple "MaVariable" par "a"), en supprimant des retours à la ligne, et avec quelques "économies" syntaxiques (par exemple le nom des arguments passés dans les fonctions), on allège ce fichier. Le seul problème est que, du coup, la lecture "humaine" devient un peu compliquée (ce qui est un avantage autant qu'un inconvénient : il devient plus difficile pour l'utilisateur averti de "jouer" avec vos scripts, mais il devient quasi-impossible pour vous de débugger / modifier votre script).
Google propose donc un outil permettant de "compresser" (car, finalement, il s'agit à peu près du même processus). Vous pouvez tester ce compresseur via l'interface utilisateur http://closure-compiler.appspot.com.
Pourquoi utiliser Google Closure en PHP ?
Comme dit précédemment, la modification de vos script compressés est excessivement peu évidente (à moins de n'être un surhomme ^) . L'utilisation de PHP pour compresser vos scripts pourrait donc permettre d'afficher le script compressé, et de conserver, sur votre serveur, les fichiers js originaux - non compressés.
Google Closure impose, par contre, un nombre limité de compressions par heure. Concrètement, vous ne pourrez pas réellement compresser vos scripts "à la volée". Il faudra donc passer par un système de cache ou équivalent. Pour ma part, j'ai choisi d'enregistrer le timestamp de la dernière compression, et de forcer la recompression toutes les 24 heures. (Concrètement, si le timestamp enregistré date de + de 24 heures, alors on demande à google de le recompresser.
Voici, tout d'abord, le script (via curl) permettant d'obtenir votre js compressé en php.
$script = file_get_contents('http://www.domain.com/scripts/script.js');
$ch = curl_init('http://closure-compiler.appspot.com/compile');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'output_info=compiled_code&output_format=text&compilation_level=SIMPLE_OPTIMIZATIONS&js_code=' . urlencode($script));
$output = curl_exec($ch);
curl_close($ch);
Ce script a été trouvé sur http://www.bloggingdeveloper.com/post/Using-Google-Closure-Compiler-with-PHP-5.aspx
De mon côté, j'ai créé un fichier .php qui réunit tous les js dont je vais avoir besoin :
$c.=file_get_contents('script1.js');
$c.=file_get_contents('script2.js');
$c.=file_get_contents('script3.js');
Il faut, premièrement, spécifier 2 variables : l'une pour le fichier .log qui contiendra le timestamp, et l'autre pour le fichier .js de destination. Disons, par exemple :
$fichier_log = 'timestamp.log';
$fichier_js = 'script.js';
Créons une fonction compress_js qui, quand elle est lancée, compresse le js via le script php curl, enregistre le résultat dans $fichier_js, et enregistre le timestamp dans $fichier_log.
Créons une fonction compress_js qui, quand elle est lancée, compresse le js via le script php curl, enregistre le résultat dans $fichier_js, et enregistre le timestamp dans $fichier_log.
function compress_js(){
//Préparation de la source javascript
$c.=file_get_contents('script1.js');
$c.=file_get_contents('script2.js');
$c.=file_get_contents('script3.js');
// Importation des variables de fichiers
global $fichier_log;
global $fichier_js;
// Sauvegarde du timestamp
$fp=fopen($fichier_log, 'w+');
fputs($fp, time());
fclose($fp);
// Compression du js
$ch = curl_init('http://closure-compiler.appspot.com/compile');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'output_info=compiled_code&output_format=text&compilation_level=SIMPLE_OPTIMIZATIONS&js_code=' .urlencode($c));
$output = curl_exec($ch);
curl_close($ch);
// Sauvegarde du fichier compressé.
$fp=fopen($fichier_js, 'w+');
fputs($fp, $output);
fclose($fp);
// Affichage du résultat
die($output);
}
A présent, codons un petit bout de php qui vérifiera le dernier timestamp, et qui executera compress_js en fonction du timestamp récupéré.
// Vérifions d'abord que le fichier log et le fichier js existent bien.
// Sinon, cela voudrait dire qu'il s'agit d'une première exécution.
if(is_file($fichier_log) && is_file($fichier_js)){
// Récupération du timestamp
$last_closure=file_get_contents($fichier_log);
// Vérification du timestamp
if($last_closure > (time() - 86400)){
// Affichage du fichier js sauvegardé
die(file_get_contents($fichier_js));
}
// Recompression du js
else die(compress_js());
}
// Première exécution du script, compression.
else die(compress_js());
L'avantage de ce script est que, d'une part, il permet donc de conserver ses fichiers js non compressé, et, d'autre part, il n'exécute le curl que lorsque la compression date de plus de 24 heures.
Donc, gain de performances côté client, et côté serveur, il s'agit juste d'un curl toutes les 24heures.
Vous trouverez le code source complet en pièce jointe à l'article.