Aller au contenu

Comment réunir et compresser plusieurs scripts?


allatoja

Sujets conseillés

Bonjour à tous,

J'ai construit un site internet qui utilise plusieurs scripts, d'une taille totale de 39Ko. Comme je trouve que c'est un peu trop, j'ai cherché comment réduire leur taille, et trouvé ceci qui a l'air intéressant: http://www.blackotine.fr/non-classe/compre...vascript-et-css

Mon problème: je crois avoir suivi scrupuleusement les instructions, et pourtant, cela ne marche pas, ce qui signifie que sur ma page de test les scripts ne fonctionnent pas.

J'ai vérifié tous les trucs idiots (y a-t-il des problèmes de majuscules, les chemins d'accès sont-ils les bons, etc). J'utilisais déjà un fichier .ht access qui fonctionne sans problème. J'en suis arrivée à la conclusion que c'est ce fameux fichier combine.php qui est mal configuré. C'est pourquoi je viens chercher de l'aide, car le langage php est du chinois pour moi!!...

Quelqu'un pourrait-me dire quels sont les paramètres qu'il faut modifier et adapter à chaque utilisateur?...Merci d'avance!

Voilà le code:


<?php

$cache = true;
$cachedir = dirname(__FILE__) . '/cache';
$cssdir = dirname(__FILE__) . '/css';
$jsdir = dirname(__FILE__) . '/javascript';

// Determine the directory and type we should use
switch ($_GET['type']) {
case 'css':
$base = realpath($cssdir);
break;
case 'javascript':
$base = realpath($jsdir);
break;
default:
header ("HTTP/1.0 503 Not Implemented");
exit;
};

$type = $_GET['type'];
$elements = explode(',', $_GET['files']);

// Determine last modification date of the files
$lastmodified = 0;
while (list(,$element) = each($elements)) {
$path = realpath($base . '/' . $element);

if (($type == 'javascript' && substr($path, -3) != '.js') ||
($type == 'css' && substr($path, -4) != '.css')) {
header ("HTTP/1.0 403 Forbidden");
exit;
}

if (substr($path, 0, strlen($base)) != $base || !file_exists($path)) {
header ("HTTP/1.0 404 Not Found");
exit;
}

$lastmodified = max($lastmodified, filemtime($path));
}

// Send Etag hash
$hash = $lastmodified . '-' . md5($_GET['files']);
header ("Etag: \"" . $hash . "\"");

if (isset($_SERVER['HTTP_IF_NONE_MATCH']) &&
stripslashes($_SERVER['HTTP_IF_NONE_MATCH']) == '"' . $hash . '"')
{
// Return visit and no modifications, so do not send anything
header ("HTTP/1.0 304 Not Modified");
header ('Content-Length: 0');
}
else
{
// First time visit or files were modified
if ($cache)
{
// Determine supported compression method
$gzip = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip');
$deflate = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'deflate');

// Determine used compression method
$encoding = $gzip ? 'gzip' : ($deflate ? 'deflate' : 'none');

// Check for buggy versions of Internet Explorer
if (!strstr($_SERVER['HTTP_USER_AGENT'], 'Opera') &&
preg_match('/^Mozilla\/4\.0 \(compatible; MSIE ([0-9]\.[0-9])/i', $_SERVER['HTTP_USER_AGENT'], $matches)) {
$version = floatval($matches[1]);

if ($version < 6)
$encoding = 'none';

if ($version == 6 && !strstr($_SERVER['HTTP_USER_AGENT'], 'EV1'))
$encoding = 'none';
}

// Try the cache first to see if the combined files were already generated
$cachefile = 'cache-' . $hash . '.' . $type . ($encoding != 'none' ? '.' . $encoding : '');

if (file_exists($cachedir . '/' . $cachefile)) {
if ($fp = fopen($cachedir . '/' . $cachefile, 'rb')) {

if ($encoding != 'none') {
header ("Content-Encoding: " . $encoding);
}

header ("Content-Type: text/" . $type);
header ("Content-Length: " . filesize($cachedir . '/' . $cachefile));

fpassthru($fp);
fclose($fp);
exit;
}
}
}

// Get contents of the files
$contents = '';
reset($elements);
while (list(,$element) = each($elements)) {
$path = realpath($base . '/' . $element);
$contents .= "\n\n" . file_get_contents($path);
}

// Send Content-Type
header ("Content-Type: text/" . $type);

if (isset($encoding) && $encoding != 'none')
{
// Send compressed contents
$contents = gzencode($contents, 9, $gzip ? FORCE_GZIP : FORCE_DEFLATE);
header ("Content-Encoding: " . $encoding);
header ('Content-Length: ' . strlen($contents));
echo $contents;
}
else
{
// Send regular contents
header ('Content-Length: ' . strlen($contents));
echo $contents;
}

// Store cache
if ($cache) {
if ($fp = fopen($cachedir . '/' . $cachefile, 'wb')) {
fwrite($fp, $contents);
fclose($fp);
}
}
}
?>

Modifié par Dadou
Merci d'utiliser la balise CODEBOX pour les longs codes
Lien vers le commentaire
Partager sur d’autres sites

Hello,

vu que tu n'es pas à l'aise avec PHP, ne serait il pas préférable d'utiliser un outre outil, tel YIU Compressor, qui est en Java ? (à ne pas utiliser pour un traitement à la volée par contre)

Lien vers le commentaire
Partager sur d’autres sites

Le script en lui même n'a à priori rien de compliqué, mais je ne partage pas du tout ce choix technique : concaténer les fichiers à la volée via PHP coté perfs serveur ça n'est pas l'idéal, et désactiver une partie de la mise en cache navigateur pour cela ça n'est pas non plus l'idéal coté perfs client.

Au final pour moi on se complique les choses sans réel apport. Encore le script se chargerait de la "minimisation" (ce que je pensais au début, mais j'ai confondu avec SmartOptimizer), ce pourrait être une solution "faute de mieux", mais là je reste très dubitatif quant à l'intérêt de l'outil.

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...