2010-07-14 4 views
0

Pour réduire les requêtes http et faciliter le processus de déploiement des fichiers js/css, j'ai configuré mon application php pour concaténer les fichiers js et css. Tous les fichiers inclus sont séquentiellement combinés dans un fichier volumineux en utilisant des codes à 2 lettres pour chaque fichier (par exemple, home.js code = "AA"). Pour générer les noms, je combine tous les codes dans l'ordre où ils sont chargés, ajoutez un trait de soulignement, puis l'horodatage (ex "AABACE_12345678.js"). Ensuite, dans le répertoire où ils sont servis, j'utilise une directive apache dans htaccess pour analyser les fichiers avec php (sing sethandler) afin que je puisse contrôler les en-têtes et renvoyer 301 en-têtes non modifiés.Mise en cache dans JS/CSS

Malheureusement cela ne fonctionne pas ... J'ai testé la merde avec le panneau Net de firebug et liveHTTPHeaders. La page charge le fichier à chaque fois, même si elle doit l'avoir dans le cache. Voici un exemple des en-têtes de réponse l'un des retours de fichiers:

Date    Wed, 14 Jul 2010 17:00:28 GMT 
Cache-Control  private 
Content-Encoding gzip 
Etag    "4b4a6d50f9acf924b9dce14e415f5c78" 
Expires    Wed, 28 Jul 2010 17:00:28 GMT 
Vary    Accept-Encoding 
X-Powered-By  PHP/5.2.6 
Last-Modified  Wed, 14 Jul 2010 16:59:35 GMT 
Content-Length  39305 
Content-Type  text/css 

Note: J'ai omis certains en-têtes non liés à la mise en cache, comme keepAlive, serveur, etc

Je tiens également à noter que je m gzipping conditionnellement le contenu, d'où l'en-tête privé de contrôle de cache. Qu'est-ce que j'oublie ici? Le contenu doit être mis en cache en raison de l'en-tête expires. Je génère l'etag à partir d'un md5 a du nom de fichier + timestamp, de sorte que ne change jamais pour le fichier. Dernière modification ne change jamais, ne change jamais .... Expires

[EDIT]

Ainsi, après d'autres tests, mes fichiers CSS sont mises en cache se, mais mon javascript est pas. Si j'ai deux fichiers, avec des en-têtes de cache IDENTICAL (etag, expires, last-modified, cache-control) mais la seule chose différente est le type de contenu (un "text/css" un "text/javascript"), SEULEMENT le css est mis en cache ... frustrant

+0

Je suppose avec horodatage que vous voulez dire le dernier horodatage de filemtime(), et non l'horodatage actuel? – Wrikken

+0

@Wrikken - Correct. Chaque fois qu'un des fichiers js/css inclus est mis à jour, il en crée un nouveau avec l'horodatage en cours dans le nom. Mais l'horodatage utilisé pour générer les en-têtes Etag/Last-modified est équivalent à ce qui serait retourné par filetime(). – eCaroth

+0

OK, mais juste pour être super-sûr: l'horodatage du fichier requis reste le même, et vous vous souvenez d'une manière ou d'une autre de l'horodatage automatiquement en indiquant le fichier à charger? Si oui, avez-vous une url pour nous de tester? Vous ne seriez pas le premier à être contrecarré par «Je développe ce site web afin de ne rien mettre en cache» réglage personnel dans son navigateur. – Wrikken

Répondre

0

C'est un exercice intéressant, mais il me semble qu'à long terme, si votre site commençait à être martelé, la combinaison côté serveur et le changement de nom des fichiers pourraient ajouter leurs propres pire que de simplement charger quelques fichiers supplémentaires. Je serais intéressé de voir quelques statistiques pour savoir quels effets cela a sur le chargement du serveur. J'ai fait du remaniement pour une banque internationale - mon équipe a repensé plus de 1 000 sites majeurs de cartes de crédit, dont certains ont reçu plus d'un million d'exemplaires uniques par jour (trafic assez sérieux). optimisation. À la fin, nous avons fait les bases comme la minimisation des fichiers js et autres, et fait un usage intensif des sprites pour les raisons que vous essayez de surmonter. Mais en analysant les ramifications d'aller aux niveaux dont vous parlez, il a été déterminé que le coût en heures d'homme surpasserait de manière significative le bénéfice en coûts de bande passante sauvés - même dans une situation où une épargne/fichier 5k équivaudrait à 5gb de bande passante quotidienne.

Avez-vous une copie de la "vieille façon" de faire les choses? Une analyse comparant l'ancien et le nouveau une fois que vous avez léché ce serait cool.

+0

La bande passante n'est pas la seule considération. La combinaison de fichiers et la création de sprites réduit le nombre de transferts, ce qui peut réduire considérablement la latence lors de l'affichage d'une page. –

+0

Ce fichier n'est généré qu'une seule fois à la volée, puis est simplement diffusé chaque fois que le fichier est requis. Les fichiers JS et CSS sont déjà minifiés, ils sont juste concaténés pour réduire les requêtes http, comme l'a dit Chris Arguin. Tout cela fonctionne très bien, je n'ai aucun problème ici. Mais les fichiers ne sont pas en cache du tout ce qui est mon problème. – eCaroth