2010-03-31 6 views
0

Donc, mon application utilise beaucoup de fichiers js. C'est beaucoup de demandes http. J'ai décidé de les combiner dynamiquement au serveur dans des paquets de 3-4 fichiers battus par fonctionnalité.Les fichiers JavaScript créés dynamiquement seraient-ils mis en cache?


Ma demande côté client est: ... script type = "text/javascript" src = "http://mydomain.com/core-js.php" ...

Mon côté serveur: --core-js.php-- header ("Content-type: application/x-javascript");

include_once ('file1.js'); include_once ('file2.js'); include_once ('file3.js'); include_once ('file4.js');


Je suis en train d'un futur lointain viennent à échéance en-tête sur le noyau-js.php. Ma question est, core-js.php serait mis en cache du côté client? Si c'était le cas, quelqu'un pourrait-il expliquer comment?

Merci!

+0

Voulez-vous les mettre en cache ou non? Est-ce que core.js.php retour alway même javascript, ou est-il assemblé dynamiquement en fonction des besoins de la page? – Rob

+0

Je ne veux les mettre en cache. ce serait la même collection de fichiers à chaque fois. – venksster

Répondre

3

Le client ne sait pas ou se soucie que ce qui lui a été envoyé soit satisfait en regroupant plusieurs fichiers côté serveur. Le client doit le mettre en cache si les en-têtes de mise en cache sont corrects. Vous voudrez les vérifier attentivement pour être sûr que votre installation PHP n'envoie pas d'autres en-têtes qui sont en conflit (Firefox + Firebug est bon pour ça), car les pages PHP ont tendance à être utilisées pour les choses dynamiques où vous ne voulez pas de cache .

0

La grande majorité des navigateurs et des proxys de mise en cache respecteront l'en-tête d'expiration (s'il est défini).

0

Oui, il le fera. Le client ne sait pas que le fichier js qu'il demande est un tas d'autres fichiers coupés en un, il voit juste un fichier js, celui qu'il a demandé et il lui dit de le mettre en cache, core-js.php. Tant que vous ne changez pas le nom du fichier (core-js.php), il ne devrait pas y avoir de problème. Sur une autre note, vous devriez jeter un oeil à Minify http://code.google.com/p/minify/ Vous pouvez fusionner et mettre en cache non seulement js mais css dans les groupes, en gros ce que vous faites. Je l'utilise depuis un moment sans problème et c'est plutôt sympa.

0

Oui, mais c'est compliqué. PHP par défaut ajoute un tas d'en-têtes qui empêchent la mise en cache. Vous devrez vous assurer que vous supprimez tous. En outre, votre script PHP comprend-il les en-têtes If-Modified-Since et If-None-Match? Générez-vous même des en-têtes Last-Modified et ETag en premier lieu? C'est difficile à obtenir, et pourquoi s'embêter, quand votre serveur web a tout ce qui est intégré?

Je le ferais différemment. Faites la demande à core.js, pas core.php. Bien sûr, core.js n'existe pas, alors .htaccess intercepte la requête et l'adresse à index.php. Maintenant, index.php génère le javascript requis et le sert au client. Il crée également le fichier core.js. Les requêtes futures pour core.js seront traitées par Apache normalement pour les fichiers statiques, sans s'approcher de PHP.

Et si vous voulez être en mesure de mettre à jour le javascript, vous pouvez utiliser les URL du formulaire last-modified-timestap.core.js. La modification de l'horodatage dans le code HTML générera un nouveau fichier javascript sur la première requête.

Je fais cela pour CSS créé dynamiquement (le concepteur peut modifier CSS dans le panneau d'administration, avec les valeurs enregistrées dans la base de données), et il fonctionne bien.

1

S'il vous plaît voir: http://www.jonasjohn.de/snippets/php/caching.htm, vous devez vérifier les en-têtes de requête entrante pour envoyer la bonne réponse. Vous pouvez faire quelque chose comme ci-dessous:

<?php 
ob_start(); 
$filemtimes = array(); 
foreach(array('file1.js','file2.js') as $file) 
{ 
include_once($file); 
$filemtimes[]= filemtime($file); 
} 

$date = gmdate('D, d M Y H:i:s', max($filemtimes)).' GMT'; 
$length = ob_get_length(); 
$etag = md5($date.$lengte); 

$headers = apache_request_headers(); 


if(!empty($headers['If-None-Match']) && !empty($headers['If-Modified-Since'])) 
{ 

if 
(
    $etag == md5($headers['If-Modified-Since'].$length) 
) 
{ 

     ob_end_clean(); 

      header("Content-type: application/x-javascript"); 
     header('Last-Modified: '.$date."\r\n"); 
     header('Expires: '.gmdate('D, d M Y H:i:s', (time()+3600)).' GMT'."\r\n"); 
     header('Cache-Control: max-age=3600'."\r\n"); 
     header('ETag: '.$headers['If-None-Match']."\r\n"); 
      header('HTTP/1.1 304 Not Modified'); 
     header('Connection: close'); 

     exit; 
    } 
} 
header("Content-type: application/x-javascript"); 
header('Last-Modified: '.$date."\r\n"); 
header('Expires: '.gmdate('D, d M Y H:i:s', (time()+3600)).' GMT'."\r\n"); 
header('Cache-Control: max-age=3600'."\r\n"); 
header('ETag: '.$headers['If-None-Match']."\r\n"); 
header('Content-Length: '.$length."\r\n"); 
header('Accept-Ranges: bytes'."\r\n"); 
ob_end_flush(); 
exit; 
?> 

Votre script sera mis en mémoire cache. Aucune donnée n'est envoyée au client. Côté serveur, le calcul des inclusions et des modifications est effectué pour chaque requête. Peut-être stocker etag et temps de modification dans la session ou cookie pour faire le contrôle avant inclus et les calculs. Ou vérifiez les filesizes au lieu de includes.

Questions connexes