Cyril Godefroy
Premire Ždition , Juillet 2007
Durant
mes quelques annŽes d'expŽrience dans le domaine de la crŽation et du dŽveloppement
de sites web (12 ans quand mme), j'ai ŽtŽ plusieurs fois confrontŽ ˆ des
problŽmatiques de performance des sites. A chaque fois, l'exigence est devenue
plus forte, au fur et ˆ mesure que la vitesse de connexion des internautes
augmentait, que les fonctionnalitŽs Žtaient ŽvoluŽes, que le contenu Žtait
riche. J'ai travaillŽ d'abord essentiellement sur des sites o les problmes de
performance se situaient au niveau du code sur le serveur. Mais au fur et ˆ
mesure de l'enrichissement des sites web, ce n'est plus cet aspect qui avait de
l'importance. C'est le temps d'affichage complet de la page qui a pris le pas
sur la rapiditŽ de l'accs ˆ la page.
Ce
changement de mentalitŽ est bŽnŽfique ˆ plusieurs titres :
¥on
s'intŽresse de manire prŽcise ˆ ce qui est ressenti par l'internaute qui navigue
sur le site,
¥on
partage la responsabilitŽ de l'affichage de la page de manire transverse, du
graphiste qui l'a dessinŽe au dŽveloppeur qui l'a construite en passant par le
serveur qui la donne,
¥on
change la vision que l'on a de la performance, d'une vision systme ˆ une vision
client.
Les
outils ont ŽvoluŽ en parallle de la perception et des besoins des entreprises.
J'ai connu un outil comme Witbe ˆ ses
dŽbuts, ˆ la fin des annŽes 90, ˆ une Žpoque o il Žtait trs orientŽ
systme. A l'Žpoque, on l'utilisait principalement pour avoir le temps de rŽponse
et la disponibilitŽ d'une page web html, sans prendre en compte le contenu de
ladite page. Aujourd'hui, certains des outils de mesure de Witbe permettent de
rŽaliser des scŽnarii enchainant plusieurs pages, et d'autres outils permettent
de faire des chargements de page complets avec de vrais navigateurs, tout en
ayant encore la richesse statistique de l'outil.
Le
savoir-faire ˆ ŽvoluŽ aussi, ainsi que la manire de crŽer des sites. Du vilain
site avec de nombreux tableaux imbriquŽs et de fausses images qui foraient
l'aspect et bloquaient les tailles des colonnes, cellules etc, on est passŽ aux
sites exploitant enfin vraiment les feuilles de styles (css) et permettant
d'accŽder au contenu au travers du javascript pour modifier celui ci ˆ la
volŽe, tŽlŽcharger de nouveaux fichiers, envoyer des mises ˆ jour de donnŽes ˆ
la volŽe etc.
Cet
ebook apporte sa pierre ˆ l'Ždifice de la performance du web. Au travers d'une
vue orientŽe internaute et client, on va aborder la question de la performance
d'un site web, voir quels sont aujourd'hui les Žcueils les plus handicapants et
les plus frŽquents et les mŽthodes qui vous permettront dÕamŽliorer vos
performances, de baisser vos cožts, voire de gagner plus de clients. Evoluant
entre des aspects fonctionnels, des aspects techniques, c'est une arme ˆ mettre
entre toutes les mains : du graphiste au chef de projet, de l'admin rŽseau
au dŽveloppeur, tous ont intŽrt ˆ faire des sites web plus beaux, plus
efficaces et aussi plus rapides.
Optimiser
la performance d'un site web, ce n'est pas qu'un vilain mot sorti de la bouche
d'un expert fŽru de temps de rŽponse. C'est avant tout un besoin marketing, la
volontŽ de baisser le cožt de fonctionnement, le besoin de rŽpondre aux
attentes du client. Il faut donc voir les mesures techniques qui contribuent ˆ
l'optimisation du temps de rŽponse et du temps d'affichage d'un site sous cet
angle.
Baisser
les cožts
En
optimisant le temps d'affichage de votre site, vous allez Žconomiser sur votre
bande passante. L'Žconomie ne sera peut tre pas immŽdiate, elle ne sera peut
tre pas non plus dŽfinitive : il est Žvident qu'en amŽliorant la qualitŽ de
votre site, vous verrez plus d'utilisateurs, plus souvent, et qui amneront
plus de petits copains. Vous allez donc forcŽment augmenter le nombre de
visiteurs et le nombre de pages vues. MathŽmatiquement, cela entra”nera une
augmentation de la bande passante : mais votre bande passante sera plus
rentable.
Mieux
ma”triser son architecture
Le fait
de vouloir optimiser et rendre beaucoup plus performant vos pages web va vous
forcer ˆ avoir une meilleure ma”trise de votre architecture, et de conna”tre
parfaitement celle ci : serveurs web, Žquipement de performance et de sŽcuritŽ,
utilitŽ de ceux ci, systmes de cache, flux existants.
Bien
entendu, vous devez dŽjˆ conna”tre votre architecture, et tre capable de
valider lÕusage de tel ou tel Žquipement et application dans un parcours web.
Si vous nÕtes pas encore capable de le faire, soyez sžr que le fait de se
pencher sur votre disponibilitŽ et votre performance va vous forcer ˆ le faire.
AmŽlioration
de la qualitŽ perue
Si vous
amŽliorez la performance de votre site, notamment sur ses pages les plus importantes,
vous amŽliorerez la perception des utilisateurs : votre site est plus prs plus
rŽactif ˆ leurs besoins, plus efficace et il est donc meilleur que celui de
votre concurrent direct. Si
votre site est un site de e-commerce, lÕamŽlioration de la qualitŽ se convertira
automatiquement en espces sonnantes et trŽbuchantes.
NÕoubliez
que votre concurrent sur internet
nÕest quÕˆ un clic de souris, et que les utilisateurs qui sont prts ˆ faire la
queue pendant plusieurs minutes ˆ la caisse, debouts, pressŽs, sont les mmes
qui vont refuser dÕattendre plus de 15 secondes sur le panier de votre site.
Avant
de commencer ˆ voir dans le dŽtail ce qui prend du temps dans le tŽlŽchargement
d'une page web, on va reposer un peu les bases d'un certain nombre de fonctionnements
du web de 2007.
Aujourd'hui,
quand on visite un site web, on ouvre son navigateur prŽfŽrŽ, qu'il s'agisse
d'Internet Explorer, de Firefox, de Safari ou d'un autre encore plus exotique
(Opera, Camino, lynx...). On va directement ˆ une adresse en www.quelquechose.fr ou .com, on clique sur un lien, on
remplit un formulaire, voire on accde ˆ une application comme un webmail.
A
chaque clic, on dŽclenche une requte http qui va chercher une ressource, en
gŽnŽral une ressource html. Il y a donc du trafic rŽseau du navigateur vers le
serveur (quel qu'il soit) que nous appellerons trafic montant. Cette requte donne
lieu ˆ une rŽponse du serveur. La rŽponse peut tre une redirection, ou du
contenu. S'il s'agit de contenu html, le navigateur attend d'avoir tout le
contenu et commence ˆ parser, c'est ˆ dire ˆ analyser et transformer en infos
qu'il peut comprendre, le contenu. Il rencontre des balises, de nouvelles
ressources qui lui sont indiquŽes comme nŽcessaires (une image, un fichier
Flash, une feuille de style...). Pour chaque de ces ressources, il va initier
un autre cycle requte/rŽponse. C'est ˆ dire que pour chaque image, css,
javascript, il va crŽer une requte, l'adresser au serveur et attendre que
celui ci lui renvoie la ressource pour l'exploiter.

etc
....
A
chacune des requtes et des rŽponses, on va distinguer une partie en-tte
(header) qui contient des mŽta donnŽes, et les donnŽes elles-mme. L'en-tte
contient des informations, le Referer (pour qui je demande cette ressource),
les informations du navigateur, etc:
Informations
gŽnŽralement trouvŽes dans les en ttes de requtes
Host
User-Agent
Accept
Accept-Language
Accept-Encoding
Accept-Charset
Keep-Alive
Connection
Referer
Cookie
Informations
trouvŽes dans les en ttes de rŽponses
Date
Server
Last-Modified
Etag
Accept-Ranges
Vary
Content-Encoding
Content-Length
Content-Type
Ces
enttes ne sont pas limitatifs et nous verrons que d'autres existent qui ont un
intŽrt.
Quand
on charge une page html, on ne sait pas d'o vient le contenu : on peut avoir
une page de Yahoo, avec des images qui viennent de l'AFP, de la pub d'une
rŽgie, une autre d'une autre rŽgie. Ces diffŽrents contenus sont fournis par
diffŽrents services. Sans avoir diffŽrents services, on peut aussi avoir
diffŽrents serveurs ˆ l'intŽrieur d'un mme domaine. Ce n'est le cas que quand
on commence ˆ avoir un gros serveur, et un gros service.
Exemples
d'Žchanges entre un navigateur et un serveur
Request
Headers
Host
User-Agent
Mozilla/5.0
(Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4
Accept
text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language
en-us,en;q=0.5
Accept-Encoding
gzip,deflate
Accept-Charset
ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive
300
Connection
keep-alive
Cookie
PREF=ID=a4a..............07:LM=117605450..............6M1PV
Response
Headers
Cache-Control
private
Content-Type
text/html;
charset=UTF-8
Content-Encoding
gzip
Server
GWS/2.1
Content-Length
1688
Date
Wed, 04
Jul 2007 20:15:45 GMT
La
difficultŽ est souvent de faire le tri entre la performance des diffŽrents
ŽlŽments qui font la rapiditŽ d'une page, de simplifier les diffŽrentes
requtes et de trouver les fautifs. On peut s'appuyer sur les quelques outils
qui sont fournis de base avec un navigateur, mais ceux ci s'avrent rapidement
insuffisants.
HTML
Le HTML
reste le principal format des pages web. Il sÕagit dÕun texte formatŽ avec des
balises selon des rgles assez strictes et prŽcises qui Žvoluent avec les
versions.
CSS
Les
feuilles de styles sont des fichiers annexes aux pages HTML qui fournissent les
rgle de formatage typographiques des diffŽrents ŽlŽments de la page :
paragraphes, images, titres, zones spŽcifiques (pieds de pages, menus etc)
Javascript
Les
fichiers javascript sont des fichiers de code ˆ exŽcuter par le navigateur, pas
pa le serveur
Images
Les
images dÕun site web peuvent tre de trois formats : gif (256 couleurs), jpeg
(adaptŽ aux photos), png (multiusage, destinŽ ˆ internet). Un format vectoriel
existe mais est trs rarement utilisŽ : le svg.
Multimedia
Par multimedia, jÕentends
interactif et animŽ, ou vidŽo. Les fichiers animŽs interactifs sont
principalement des fichiers Flash, un format propriŽtaire mme sÕil est public.
La vidŽo est en gŽnŽral sous le format Flash VidŽo, vu lÕubiquitŽ du lecteur
Flash sur les navigateurs : la part des navigateurs ŽquipŽs de la dernire
version de Flash est estimŽe ˆ 92%.
L'outillage
d'analyse de la performance est un outillage client. Ce n'est pas un outillage
serveur, sur les performances des applications.
Abordons
la question de la performance des applications serveurs une dernire fois ici
pour dire ˆ quel point ce n'est pas le sujet de cet ebook, et ce n'est pas un
sujet aussi complexe et mal ma”trisŽ que celui de la performance globale de la
page.
Tout
bon dŽveloppeur se doit d'effectuer des tests sur les applications qu'il livre,
notamment des tests de performance. Ces tests de performance existent pour
vŽrifier qu'une application est capable, en fonction des services auxquelles
elle est connectŽe et des serveurs sur lesquels elle est hŽbergŽe de servir le
nombre de requtes par secondes qui lui est demandŽ. Le niveau dÕexigence de
capacitŽ vient du marketing, ou de quelqu'un avec une vision marchŽ du service.
Pour analyser des dŽrives qui pourraient se produire en production, ce
dŽveloppeur va ajouter tout une ensemble de traces, activables ˆ la volŽe ou
pas, qui lui permettront d'Žvaluer le temps de rŽponse d'une page de manire
fine, en regardant o il perd du temps. Il pourra ensuite le faire sur une
pŽriode un peu longue (quelques minutes ou quelques heures) pour rechercher la
cause d'une lenteur. C'est le moins que l'on attend de lui.
Evidemment
il y a le plus : la capacitŽ ˆ activer des logs en fonction de certains paramtres,
par exemple uniquement sur certaines requtes ou certaines pages. Ce plus ne
semble pas tre ˆ la portŽe de tout le monde, et la plupart des dŽveloppeurs
s'arrtent ˆ un tout ou rien : soit je trace tout, soit je ne trace rien...
Quelque
soit l'analyse qui est menŽe ˆ partir de ces tests et de ces traces, elle finit
en gŽnŽral par une refonte d'architecture applicative, une augmentation de
capacitŽ de traitement, un achat de serveur, un ajout d'index : des choses
connues et ma”trisŽes par les dŽveloppeurs.
Mais
les dŽveloppeurs ont rarement une bonne vue de l'intŽgralitŽ de la cha”ne d'affichage
de la page. Il comptent en requtes par seconde sur une seule ressource, leur
page. On va vite dŽcouvrir qu'ils ne sont pas en charge de la performance
totale des pages.
Dans le
sujet qui nous occupe, la performance vu du c™tŽ utilisateur, les outils sont relativement
peu nombreux. J'en conseille quatre sur diffŽrents navigateurs.
Firebug
Firebug (https://addons.mozilla.org/en-US/firefox/addon/1843)
est
une extension pour Firefox. Pour l'installer sur Firefox, il suffit d'aller sur
le site, de cliquer sur le logo. Firefox est protŽgŽ et refusera en premier
lieu de le tŽlŽcharger. Une fentre d'avertissement vous permettra d'accŽder
aux rŽglages permettant de rendre possible l'installation.
C'est
un couteau suisse qui a plusieurs fonctionnalitŽs. Celle qui nous intŽresse est
le dernier onglet 'Net'. Quand on accde ˆ une page, ce module enregistre tous
les enttes de requte et de rŽponse. Ils les prŽsente ˆ la volŽe dans un
chronogramme. Cela permet de voir comment, en combien de temps et ˆ quel moment
sont tŽlŽchargŽs tous les ŽlŽments de la page. Ensuite, chaque ŽlŽment est
accessible et on peut aller voir les enttes de requte et de rŽponse.
Firebug
en action sur la home de Google : les requtes et pour chacune le dŽtail des
enttes http
Deux
dŽfauts de Firebug :
- il
prend mal en compte ce qui est dans le cache. C'est ˆ dire qu'il reprŽsente
quand mme les ŽlŽments qui ne sont pas tŽlŽchargŽs mais viennent du cache du
navigateur comme s'ils Žtaient tŽlŽchargŽs. Je n'apprŽcie pas personnellement
la reprŽsentation du cache.
- il
efface l'historique ds qu'on tŽlŽcharge une page html : on n'a donc qu'une
page visible ˆ la fois, et il fait dispara”tre les redirections intermŽdiaires
qui peuvent exister entre deux pages.
A part
ces deux dŽfauts, il est trs agrŽable d'utilisation et permet d'avoir une
bonne apprŽciation gŽnŽrale et en dŽtail de ce qui se passe en affichant une
page. Accessible d'un seul clic dans Firefox, il peut vous montrer ce qui s'est
passŽ sur la page affichŽe sans que vous ayez besoin de le dŽclencher avant de
la charger (c'est apprŽciable, je vous assure).
HttpWatch
HttpWatch
est un plug in pour Internet Explorer, le navigateur qui domine le marchŽ des
navigateurs. Rien que pour cette raison, il est indispensable. Le comportement
de Internet Explorer n'est en effet pas le mme que celui de Firefox.
HttpWatch
vient en deux versions : une gratuite le HttpWatch basic, et une payante. La
version gratuite est suffisante dans la plupart des cas, surtout si vous
associez l'usage de HttpWatch avec celui de Firebug ou Tamper Data.
La
version gratuite se limite en effet ˆ rŽcupŽrer le dŽmarrage, le temps complet
du cycle requte-rŽponse, la taille de la requte et de la rŽponse, le code
rŽponse et l'url de la requte. Elle ne vous montre pas le contenu des enttes,
il n'y a pas de chronogramme, etc.
Elle
vous montre aussi un rŽcapitulatif assez intŽressant, avec la performance, les
codes, le nombre de chargements, de connections etc. Quelques informations que
vous ne trouverez pas, ou pas aussi bien prŽsentŽes avec les deux outils
prŽcŽdents.
Le gros
inconvŽnient de HttpWatch est son prix dans la version complte, plut™t excessif
par rapport aux fonctionnalitŽs.
Ai je
prŽcisŽ que les deux outils fonctionnant avec Firefox fonctionnent de la mme
manire sur pc et sur mac? Pas besoin de redŽmarrer son mac sous windows avec
boot camp ou de lancer Parallels pour tester un site.
Safari
Web Inspector
http://www.apple.com/fr/safari
Nouveau
et intŽressant (tout chaud sorti du four ˆ programmes), la beta de safari 3.0
fonctionne ˆ la fois sur mac et sur pc (windows 2000, XP et vista). Le
tŽlŽchargement est bien entendu gratuit (mais attention c'est une version beta
c'est ˆ dire en cours, et qui peut planter).
Le
principal intŽrt pour ce qui nous concerne vient d'un outil qui est intŽgrŽ ˆ
cette version intermŽdiaire qui s'appelle le web inspector. Celui ci est
disponible avec les dernires versions et permet d'un clic droit de la souris
sur une page de visualiser plein d'informations intŽressantes, comme le contenu
source de chacun des fichiers de la page, le log javascript avec les erreurs
rencontrŽes, et un onglet 'rŽseau' qui permet de voir comme avec Firebug les
diffŽrents tŽlŽchargements, leur temps, leur ordre etc.

le
web Inspector de Safari 3 beta sous Windows
Ici on
le voit en action sur une page de Yahoo avec de la pub en vidŽo (ce qui
explique la taille gigantesque de la page). Ce que j'apprŽcie de prime abord
sur cet outil est le rassemblement en diffŽrents items (javascripts, css,
images, html) des diffŽrents objets de la page, et la vue synthŽtique poids et
temps de chargement ce qui permet de discerner rapidement ce qui prend du poids
et du temps. Apparemment, pour rendre leur navigateur trs rapide, les
dŽveloppeurs travaillant sur Safari ont boostŽ le nombre de connexions
simultanŽes et on le voit bien ici avec toutes ces lignes ayant le mme top
dŽpart.
Cet
outil est encore un peu jeune et manque ˆ mon avis de quelques informations et
de quelques options. Il mŽrite d'tre suivi. Etant open source (Webkit) vous
pouvez intervenir sur les sources, voire les recompiler vous mme si vous vous
sentez l'‰me d'un hacker. Vous pouvez surtout vous appuyer dessus pour ajouter
les fonctionnalitŽs que vous dŽsirez.
Yslow
http://developer.yahoo.com/yslow/
Yahoo
performance group a sorti en juillet 2007 un outil qu'ils avaient depuis
longtemps dans leurs cartons : Yslow.
C'est
un plugin de plugin: il se branche sur Firebug pour faire des recommandations.
Il vous donne des notes selon certains critres (un peu diffŽrents de ceux
ŽvoquŽs plus tard ici),ce qui vous permet d'Žvaluer la qualitŽ de vos
performances.
LÕonglet
performance vous permet dÕŽvaluer votre conformance ux recommandations du Yahoo
Performance Group. Personellement je ne suis pas convaincu par toutes ces
recommandations, mais elles ne sont pas plus mauvaises que dÕautres ;-)

Le
jugement de YSlow sur ses pages : D

LÕonglet
Stats : savoir combien on peut gagner sur le cache et les cookies
La
rgle des 80/20
Dans
une dŽrive de la loi de Pareto (ce sont 20% des clients qui gŽnrent 80% des
plaintes, ou 20% des plus riches dŽtiennent 80% des richesses), on peut dire
que l'on consacre 80% de ses efforts sur ce qui ne reprŽsente que 20% du temps
de chargement : le html. Si on regarde des exemples rŽels de temps de
chargement, on est rapidement ŽtonnŽs de voir que celui ci ne reprŽsente qu'une
part ridicule du temps d'affichage :

les
requtes de chargement de la page d'accueil de Yahoo France. Le html c'est la
premire en haut ˆ gauche.
Par
exemple, le chargement de la page d'accueil de Yahoo prend soit 359ms, soit
3.09s selon le point de vue que l'on choisit : 359ms pour la page html seule,
le reste Žtant dŽvolu au chargement de toutes les ressources qui vont permettre
de construire et d'afficher la page dans son ensemble. Dans ce cas, le html ne
reprŽsente que 10% et quelques du temps d'affichage de la page.
Faire
porter ses efforts sur le fichier html est donc une aberration. Une aberration
qui peut avoir du bon dans des cas extrmes, comme la page d'accueil de Google,
mais seulement dans ces cas :
les
mme requtes chez Google : minimaliste
Temps
de chargement total : 94ms, dont temps de chargement du html: 63ms.
On peut
varier les exemples sur toute une sŽrie de sites web :
|
Site web |
Temps dÕaffichage |
Temps HTML |
|
Yahoo.fr |
3.09 s |
359 ms |
|
Google.fr |
94 ms |
63 ms |
|
amazon.fr |
938 ms |
407 ms |
|
france2.fr |
4.71 s |
63 ms |
|
orange.fr |
4.3 s |
32 ms |
|
bouyguestelecom.fr |
2.29 s |
63 ms |
|
sfr.fr |
2.02 s |
31 ms |
|
liberation.fr |
12.7 s |
156 ms |
|
flickr.com |
828 ms |
16 ms |
|
lemonde.fr |
8.88 s |
188 ms |
|
cyrilgodefroy.com |
1.52 s |
94 ms |
|
msn.fr |
3.67 s |
102 ms |
|
skyblog.com |
4.75 s |
89 ms |
|
free.fr |
2.53 s |
1.53 s |
|
dailymotion |
6.97 s |
359 ms |
Bien
Žvidemment, il n'est pas question de faire des efforts que sur le temps html
puisque celui ci ne reprŽsente qu'une toute petite part du temps de chargement et
d'affichage complet de la page. C'est le temps de chargement de tous les autres
ŽlŽments qui va permettre de faire la diffŽrence. Imaginez si vous gagnez 10%
de performance sur le html sur la home de yahoo, vous gagnez 30ms. Si vous
amŽliorez le reste, vous gagnez 300ms : 10 fois plus. C'est encore plus vrai
sur le site de France 2, ou de LibŽration... Comme on le verra, on peut gagner
plus que 10%.
80 ˆ 90% du temps d'affichage d'une page est passŽ c™tŽ
client. Commencez par lˆ!
Certains
crŽateurs de sites web perdent le sens des rŽalitŽs ˆ force de faire des tests
sur leur machine locale ou sur un rŽseau trs rapide. La puissance des machines
peut avoir un effet masquant des problmes les plus importants. Je me suis donc
mis ˆ la place d'un internaute moyen et j'ai cherchŽ ˆ reprendre le b-a-ba du
chargement de page : qu'est ce qui prend du temps, qu'est ce qui bloque,
comment se dŽclenchent les tŽlŽchargements.
J'ai
pour cela crŽŽ plusieurs pages trs simples, avec beaucoup d'ŽlŽments en
gŽnŽral pour exagŽrer volontairement les rŽsultats. Ces tests sont accessibles
ˆ l'adresse http://cyrilgodefroy.com/fr/testqos/ . Si
vous dŽsirez exploiter ˆ outrance ces tests, je vous invite ˆ tŽlŽcharger ces
tests disponibles sur la mme page et ˆ les installer chez vous.
Ces
tests ne sont pas forcŽment trs durs ˆ rŽaliser, et n'apportent pas toujours
des dŽcouvertes phŽnomŽnales. Ils permettent de valider ce que l'on sait dŽjˆ
peu ou prou.
Ces
fichiers de test avec les mesures que l'on peut effectuer en les exŽcutant avec
internet Explorer et Firefox nous apprennent beaucoup de choses sur ces
navigateurs, ou valident des choses dont nous nous doutions auparavant.
Les
navigateurs sont diffŽrents
Cela
parait peut tre Žvident ˆ la plupart d'entre nous : les Žquipes de IE et
celles de Mozilla, bien qu'elles soient parties du mme navigateur, Mosaic, ont
divergŽ ˆ plusieurs reprises, et leur stratŽgie est diffŽrente quant au
tŽlŽchargement et au parsing des pages. Et il y a le rejeton WebKit (Safari
pour le grand public), ˆ l'origine seulement sur Mac, depuis quelques jours sur
Windows.
Ces
diffŽrences ne sont pas dramatiques, mais elles peuvent expliquer la diffŽrence
de rapiditŽ d'affichage de pages ou de parcours. Je me suis retrouvŽ dans
certains cas ˆ avoir jusqu'ˆ 30% de diffŽrence entre firefox et internet
explorer sur un parcours. Les mesures avaient tendance ˆ mettre en exergue
cette diffŽrence.
Ce
qu'il y a dans le header, c'est important
Les
enttes des fichiers html sont bien trop souvent ignorŽes par les dŽveloppeurs.
Je ne
parle mme pas de la syntaxe des balises d'indication des pages. Non, je parle
de ce qu'il y a dans la balise header. On a l'impression que c'est une
poubelle. Plusieurs css, diffŽrents js, des scripts en dur en plus, le tout
sans logique ni rŽflexion.
Le cas
le plus flagrant est la sŽrialisation du tŽlŽchargement des fichiers css et
javascripts. Plut™t que de rŽflŽchir, ou de faire du copier coller pour
concatŽner le contenu de plusieurs fichiers dans un seul et sous le prŽtexte
fallacieux de rendre modulaire, les dŽveloppeurs rajoutent des liens vers des
fichiers css et javascripts ˆ tire-larigot. Un exemple?
<script>
__IS_NO_PROXY__ = true;
</script>
<script
src="http://s3.unsiteweb.fr/js/css_ie_bug.js"
type="text/javascript"></script>
<link
rel="stylesheet" href="http://s3.unsiteweb.fr/css/default_size.css" type="text/css"
/>
<link
rel="stylesheet" href="http://s4.unsiteweb.fr/css/default_struct.css" type="text/css"
/>
<link
rel="stylesheet" href="http://s4.unsiteweb.fr/css/default_blocks_size.css" type="text/css"
/>
<link
rel="stylesheet" href="http://s2.unsiteweb.fr/css/default_blocks_definitions.css"
type="text/css" />
<link
rel="stylesheet" href="http://s2.unsiteweb.fr/css/default_nav_header.css" type="text/css"
/>
<link
rel="stylesheet" href="http://s2.unsiteweb.fr/css/default_nav_footer.css" type="text/css"
/>
<link
rel="stylesheet" href="http://s3.unsiteweb.fr/css/default_size.css" type="text/css"
/>
<link
rel="stylesheet" href="http://s3.unsiteweb.fr/css/common.css"
type="text/css" />
<script>
document.cfg_default_path = "http://s3.unsiteweb.fr/js/dlib4/";
</script>
<script
src="http://s3.unsiteweb.fr/js/dlib4/dlib4.07.js" type="text/javascript"></script>
<script type="text/javascript">
dlib_load_extension("layers");
dlib_load_extension("events");
</script>
<script
src="http://www.unsiteweb.fr/nav/nav_js.jsp" type="text/javascript"></script>
<script
src="http://s3.unsiteweb.fr/js/nav_left.js"
type="text/javascript"></script>
<script
src="http://s3.unsiteweb.fr/js/nav_top.js"
type="text/javascript"></script>
<script
src="http://s3.unsiteweb.fr/js/common.js"
type="text/javascript"></script>
<script
src="http://s3.unsiteweb.fr/js/scroll.js"
type="text/javascript"></script>
<script
src="http://s3.unsiteweb.fr/js/m_select.js"
type="text/javascript"></script>
<noscript>Votre navigateur doit supporter Javascript pour visualiser le site.</noscript>
<link
rel="stylesheet" href="http://s4.unsiteweb.fr/css/musique_jeux/common.css"
type="text/css" />
<link
rel="stylesheet" href="http://s1.unsiteweb.fr/css/musique_jeux/nav_left.css"
type="text/css" />
<link rel="icon" href="images/common/favicon.ico"
type="image/x-icon" />
<link rel="shortcut icon"
href="images/common/favicon.ico" type="image/x-icon" />
<link
rel="stylesheet" href="http://mus3.unsiteweb.fr/css/unsiteweb_music.css" type="text/css"
/>
<link
rel="stylesheet" href="http://mus2.unsiteweb.fr/css/musique_jeux/music.css"
type="text/css" />
<script
src="http://mus3.unsiteweb.fr/js/unsiteweb_music.js" type="text/javascript"></script>
<script
type="text/javascript" src="http://mus3.unsiteweb.fr/js/lib_utils.js"></script>
<script
type="text/javascript" src="http://mus3.unsiteweb.fr/js/class_ToolTipBox.js"></script>
<script
type="text/javascript" src="http://mus3.unsiteweb.fr/js/class_ToolTipBoxManager.js"></script>
<script
type="text/javascript" src="http://mus3.unsiteweb.fr/js/ttb_settings.js"></script>
<script
src="http://mus3.unsiteweb.fr/js/navg_unsitewebmusic.js" type="text/javascript"></script>
<!--<script src="js/mouseEvtHandler.js"
type="text/javascript"></script>-->
DŽsolŽ!
Ce n'est pas trs sympa de vous infliger cela. Mais c'est un exemple rŽel, j'ai
juste honte pour eux, et je cache (un peu) leur vrai nom.
Le
bon doctype pour le bon parser
Un
petit appartŽ sur le doctype de vos fichiers. Si vous faites des fichiers qui
s'appellent .html, qui sont servis par des serveurs http qui ont le mimetype de
text/html rŽglŽ pour les fichiers .html, ne vous amusez pas ˆ mettre un doctype
en xhtml. Vous allez vous fatiguez pour rien, voire vous tirer dans le pied.
Cet article d'un
contributeur Webkit (maciej) explique en anglais et dans des termes assez
simples la question (http://webkit.org/blog/68/understanding-html-xml-and-xhtml/). Ce
qu'il faut en retenir :
¥faire
un document en xhtml vous expose ˆ des non affichages si le parser rencontre
une erreur.
¥Internet
Explorer ne sait pas lire le xhtml.
¥seul
l'en tte http de MIME type application/xhtml+xml est traitŽe en xhtml. Les
autres sont traitŽs en html
¥Il faut mettre un doctype HTML qui active le mode
standard des navigateurs : <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01
Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
On
apprend quelques infos pas compltement inintŽressantes, alors je suis attentif
aux suggestions que certains lecteurs pourraient me faire pour aller plus loin
dans l'analyse du comportement des navigateurs. J'ai en effet conu ces tests
en fonction des comportements que j'ai observŽ, mais je n'ai pas tous les
navigateurs ˆ disposition, et les choses sont supposŽes Žvoluer d'une version ˆ
l'autre.
Le
chargement des css
Suivant
les navigateurs le chargement des css ne se fait pas de la mme faon : sur IE
et Safari, les fichiers css peuvent tre chargŽs en mme temps. Sur Firefox, le
chargement des css est sŽquentiel : on finit de charger un css avant de lancer
le chargement d'un autre.
David
Hyatt (of WebKit Fame) a Žcrit une explication de ce qui se passe dans Firefox
et Safari par rapport ˆ l'exŽcution des styles. Je ne sais pas si c'est
toujours vrai pour Safari, ni mme pour Firefox, mais l'intŽrt de son
commentaire rŽside dans l'explication des affres auxquels il doit faire face
concernant la question du rendu des styles.
Chargement
des css ne veut pas dire utilisation des css. En effet, on peut tre confrontŽ
ˆ un autre problme quand le css est long : le flash de rendu qui se produit
sous IE quand celui ci commence enfin ˆ rendre les pages.

Sous
Safari

Sous
Firefox
PrŽoccupons
nous en attendant du chargement (partie rŽseau) des css : je vous conseille de
rassembler vos css dans le minimum de fichiers pour Žviter de vous retrouver
face au chargement sŽquentiel de Firefox. Mettez les au dŽbut de votre page
html, dans l'entte du html.
Une
question que je n'ai pas abordŽe car c'est une instruction que je n'ai pas
rencontrŽ depuis longtemps est l'usage du @import dans les css. Cette
instruction des feuilles de style n'est activŽe qu'une fois que le css est
compltement chargŽ et commence ˆ tre analysŽ par le navigateur. Dans ces
conditions, on recrŽe un chargement sŽquentiel des fichiers css... Il y a peu,
un dŽveloppeur plein de bonne volontŽ mÕa ŽvoquŽ quÕil pourrait rapidement
amŽliorer son site avec plusieurs css en insŽrant le deuxime dans le premier.
Il a vite compris son erreurÉ
Le
chargement des javascripts est sŽquentiel
Ce
comportement est prŽvisible car l'ordre des fonctions dans un fichier
javascript a une importance vitale : je ne vais pas appeler une fonction dans
un deuxime fichier javascript si je ne suis pas sžr que le premier fichier
javascript qui contient cette fonction a ŽtŽ tŽlŽchargŽ. Ce chargement en
sŽquence se produit que les fichiers javascripts se trouvent dans l'en tte
html ou ˆ l'extŽrieur.
Deux
tests diffŽrents, les tests 8 et 9 permettent de vŽrifier ce que le chargement
d'un javascript peut faire sur le chargement des images ou autres ressources
statiques. Dans ces deux tests, j'ai mis les javascripts dans le corps du html.
Jusqu'ˆ lˆ pas de miracle : le rŽsultat de cet emplacement est exactement le
mme que celui du placement dans les en ttes. Par contre, le fait de
rencontrer un fichier javascript reporte le chargement des images qui peuvent
tre devant ou derrire.
J'ai
mme poussŽ le vice jusqu'ˆ faire un test 10 en mettant deux fichiers image
entre deux fichiers javascript pour voir ce qu'il se passait : oh surprise, on
lance bien le chargement de ces deux fichiers en parallle, mais le fichier
image qui est aprs les deux fichiers en question attend que le tŽlŽchargement
du deuxime fichier javascript soit fini.
Ce qui
se passe peut aussi conduire ˆ Žcrire la rgle suivante :
le chargement des
javascripts retarde le chargement de tous les ŽlŽments qui se trouvent derrire
Je tire
de tous ces tests une conclusion : il faut concentrer au maximum le contenu des
javascripts dans un seul fichier, quitte ˆ appeler les fonctions de ces
fichiers en insŽrant directement les fonctions dans le code html. On risque
sinon de voir tous les chargements d'images qui se trouvent aprs bloquŽs.
Le code
que je vous ai montrŽ plus haut est aprs ces deux sŽries de tests le pire que
l'on puisse trouver :
¥13
fichiers de styles
¥14
appels de javascripts (presque 15)
¥1
ficher javascript avant le chargement des styles : ils doivent attendre la fin
du chargement
¥Des
styles au milieu du lot des fichiers js
Je
vous jure que cet exemple est pris sur un vrai site, vraiment public. Et ce
site est censŽ recevoir une masse importante de trafic. Le meilleur est que
dans le corps du html on trouve encore des appels ˆ des scripts js.
Une
information dont certains dŽveloppeurs de navigateurs se gardent bien de
parler, et qui a une importance indŽniable sur la rapiditŽ de chargement d'une
page complte est le nombre de connexions simultanŽes. On peut jouer sur ce
paramtre pour absorber la charge sur les navigateurs qui souffrent le plus de
nombre de connexions faibles.
Il est
Žvident que si les navigateurs n'avaient qu'une connexion rŽseau (ˆ un niveau
applicatif, pas au niveau signal ou c‰ble), les pages risqueraient d'appara”tre
beaucoup moins vite : les paquets se perdent (pas beaucoup, mais cela arrive),
des contentions peuvent se produire. Le protocole TCP/IP permet de rŽduire les
risques de perdre tout un contenu ˆ cause d'un petit bout qui serait mal passŽ,
mais il n'est pas parfait et ne permet pas d'assurer une qualitŽ parfaite.
D'autant que les ŽlŽments ˆ chaque bout de la cha”ne (navigateur et serveur)
ont aussi des latences (des temps de retard) pour aller chercher une ressource
ou pour la fournir.
Les
navigateurs ont donc plusieurs connexions rŽseau ouvertes pour tŽlŽcharger plusieurs
ressources en parallle. Firefox 2.0 vient de base avec une capacitŽ de 8
connexions par serveur et 24 connexions en tout. Cela signifie que ce
navigateur va lancer 8 tŽlŽchargements de ressources en concurrence vers un
serveur par exemple serveur1.siteweb.com, et qu'il ne pourra pas tŽlŽcharger
plus de 24 ressources en mme temps. Ensuite, il fait sa sauce si plus de 3
connexions serveur sont ouvertes en mme temps.
Pour
sÕen rendre compte, on peut accŽder aux configurations cachŽes en tapant lÕurl
about:config dans la barre dÕadresse. Le paramtre
network.http.max-connections-per-server est ˆ 8:

Un
autre paramtre sur lequel le navigateur peut jouer pour tŽlŽcharger plus vite
des ŽlŽments est le pipelining : l'idŽe est de passer plusieurs requtes dans
la mme connexion ˆ la fois, et d'attendre la rŽponse ˆ toutes ces requtes
avant d'en lancer d'autres. tŽlŽchargement souffre de problmes de fiabilitŽs :
si une rŽponse met du temps, toutes les rŽponses mettent du temps. Et
cela mettrait ˆ genoux les serveurs ˆ fort trafic (imaginez devoir ouvrir une
connexion et la laisser ouverte pour chaque utilisateur sans savoir quand celui
ci va la refermer). AujourdÕhui, aucun navigateur nÕest rŽglŽ par dŽfaut de
cette manire et ce nÕest pas prt de se produire.
On
a parlŽ de Firefox, mais on n'a pas parlŽ du navigateur qui fait encore la
majoritŽ du parc : Internet Explorer 6 et 7. La version 6 d'Internet Explorer a
par dŽfaut moins de connexions ouvertes par serveur (http://support.microsoft.com/kb/183110
et http://support.microsoft.com/default.aspx?scid=kb;fr-fr;Q282402 ). On
ne peut donc pas parallŽliser de la mme faon le tŽlŽchargement des fichiers
sur Internet Explorer et sur Firefox dans la version par dŽfaut.
Dans le
cas de Internet Explorer en https, la situation s'aggrave : le nombre de
connexions simultanŽes en protocole https est encore infŽrieur. On peut voir le
phŽnomne d'empilement des tŽlŽchargements s'aggraver. Dans HttpWatch, les
tŽlŽchargements sont lancŽs ˆ peu prs au mme moment, mais les fichiers
mettent de plus en plus de temps ˆ arriver.
J'ai
mis sur le serveur http://cyrilgodefroy.com/fr/testqos des
tests permettant d'observer le phŽnomne: essayez avec vos diffŽrents
navigateurs pour voir comment se passe le chargement de fichiers diffŽrents
dans la configuration par dŽfaut.
Faire
du chargement parallle sans devoir tout casser
Pour
faire du chargement parallle de ressources sans devoir aller changer les configurations
sur les navigateurs des visiteurs (ce qui n'est pas tout ˆ fait faisable), il
faut un autre serveur. On a en effet vu que le navigateur ouvre un certain
nombre de connexions par serveur. Si on augmente le nombre de serveurs, on
multiplie donc le nombre de canaux de tŽlŽchargement.
Je
pourrais donc vous inviter ˆ crŽer un serveur img.monsiteweb.com pour stocker
vos ressources statiques images dessus, et de les mettre dessus. Pas forcŽment
facile ˆ faire en production, surtout si vous partez ensuite sur l'idŽe de
faire des serveurs physiquement diffŽrents, ou de stocker les fichiers dans des
arbres diffŽrents de rŽpertoires.
La
solution qui vous permet de rapidement rajouter un serveur sans changer votre hŽbergement,
en modifiant peu votre configuration serveur? Utilisez un CNAME dans le
serveurs de noms de votre domaine. Le CNAME est un alias qui fait pointer notre
serveur img.monsiteweb.com vers votre serveur www.monsiteweb.com. Il faut alors que votre serveur http
soit capable de rŽpondre ˆ toutes les requtes vers une adresse de type
*.monsiteweb.com avec les mmes rŽglages et le tour est jouŽ.
Les
limites du tŽlŽchargement parallle
Ce
travail d'utilisation de plusieurs noms de serveurs a des limites : en effet le
fait d'ouvrir une connexion a un cožt : rŽsolution du nom de machine, ouverture
de la connexion rŽseau, rŽutilisation aprs un tŽlŽchargement prend un petit
peu de temps ˆ chaque fois. Il y a une limite autour de 4 noms de serveurs ˆ
partir de laquelle le temps gagnŽ ˆ parallŽliser est supplantŽ par le temps de
toutes ces opŽrations.
Lˆ
encore, j'ai prŽparŽ plusieurs sŽries de fichiers disponibles ˆ partir de l'url
http://cyrilgodefroy.com/fr/testqos qui
permettent de valider avec son navigateur cible le comportement idŽal ˆ
reproduire pour une page.
Certains
amis de monsieur La Palisse diraient que le moyen le plus rapide de fournir ˆ
un internaute un fichier c'est encore de faire en sorte qu'il l'ait dŽjˆ.
Ils
n'ont pas compltement tort: c'est justement pour celˆ que les navigateurs ont
inventŽ le cache. Celui ci est utilisŽ pour stocker les ressources dŽjˆ
utilisŽes sur l'ordinateur ou le tŽlŽphone de l'internaute, en mŽmoire ou sur
disque, et recharger ces ressources quand elles sont redemandŽes. Suivant les
navigateurs, la taille du cache, le fonctionnement du cache est diffŽrent
(Safari cache ŽnormŽment par exemple). Il faut donc essayer de remplir au
maximum le cache des navigateurs. Celui ci fournit aux navigateurs le moyen
d'utiliser des fichiers sans qu'il soit nŽcessaire de les tŽlŽcharger : une
page dont toutes les ressources sont dans le cache se charge trs trs vite.
Lˆ
encore, j'ai fait plusieurs pages de tests avec des directives diffŽrentes pour
vous donner les directives les plus efficaces et les techniques qui permettent
d'amŽliorer le plus vos temps d'affichage.
Avant
d'aborder la question des directives, rŽglons la question des meta headers.
J'ai un secret pour vous: Ces balises ˆ insŽrer dans le code html ne sont pas
efficaces, et il vaut mieux ne pas les utiliser. Plusieurs raisons :
1. Que
voulez vous cacher? Des fichiers html, ou des ressources qui sont
utilisŽes au long d'un parcours? Mettre des pages html diffŽrentes dans le
cache ne permet aucune Žconomie... en effet il y trs peu de chance que vous
reveniez sur la mme page HTML au cours d'un parcours (mme si cÕest possible
et malin).
2.
Elles ne sont pas prises en compte dans le protocole http 1.1, la version
actuelle. Seuls les enttes http sont utilisŽs.
Donner
des directives de cache le long de la cha”ne
La
version simple dÕune requte http suppose qu'entre un navigateur web et le
serveur web, il y a des Žquipements 'passifs' : routeurs, routeur ADSL,
switches. Mais l'infrastructure peut tre plus ŽlaborŽe : prŽsence de load
balancers pour s'adresser ˆ plusieurs serveurs web, existence de reverse
proxies pour contr™ler l'accs ˆ certaines ressources mais pas d'autres,
firewalls pour limiter le trafic rŽseau ˆ certains ports.
Deux
Žquipements sont importants dans la gestion du cache et viennent s'intercaler
dans le flux entre le navigateur et le serveur :
¥le
proxy est un Žquipement qui se trouvera sur votre rŽseau local et contr™lera
l'accs ˆ internet (pas possible d'aller voir YouTube ou DailyMotion), tout en
fournissant un cache local.
¥le
reverse-proxy fait la mme chose mais au niveau de votre plate forme d'hŽbergement
: contr™le d'accs et cache des objets statiques demandŽs aux serveurs web pour
rŽduire la latence due au rŽseau et allŽger la charge des serveurs.
Ces
deux types d'Žquipements peuvent aussi exister chez votre FAI : l 'usage de
celui ci est alors transparent ou non. Il vise ˆ rŽduire un peu la bande
passante utilisŽe sur les liens inter-opŽrateurs et ˆ fournir les objets plus
vite.
Ces
Žquipements peuvent accueillir vos ressources statiques. Il faut leur demander
gentiment, tre capable de leur fixer des rgles pour qu'ils le fassent de la
bonne manire pour les bonnes ressources. Sinon, vous pouvez vous retrouver ˆ
montrer (ou ˆ voir) une page destinŽe ˆ un autre internaute, parce que ces
Žquipements ont 'trop' cachŽ. Ou avec des ressources trop vieilles, parce que
la durŽe fixŽe pour le cache est trop importante et aucune revalidation n'est
demandŽe.
Les
directives ˆ utiliser pour le cache
Il
existe plusieurs directives de cache.
La
premire et la plus importante est celle qui permet de ne pas avoir de cache.
Elle est double (je vous conseille d'utiliser les deux directives, qui peut le
plus peut le moins), car il y a la directive du http 1.0 et celle du http 1.1.
Pragma:
no-cache
et
Cache-Control:
no-cache, no-store
Les
autres directives permettent de contr™ler prŽcisŽment le niveau et la durŽe de
cache que l'on veut prŽconiser aux navigateurs et aux caches intermŽdiaires.
max-age=
La
directive la plus vitale sert ˆ prŽciser la durŽe de cache ˆ appliquer par un
navigateur ˆ une ressource. La durŽe prŽcisŽe est en secondes, ce qui explique
que le nombre que l'on trouve derrire est parfois trs important. Si
Cache-control: max-age=3600 appara”t dans une rŽponse par exemple, le
navigateur va considŽrer la ressource ˆ jour pendant une heure. Cette directive
est plus importante que la directive Expires, si les deux infos sont prŽsentes
dans l'en tte http.
private
private
indique aux caches qu'il ne doit pas stocker la rŽponse au navigateur. Cela
vaut pour les caches intermŽdiaires, comme les proxies et les reverse-proxies.
public
public
indique au cache que la rŽponse peut tre cachŽe alors qu'elle ne devrait pas
l'tre (comme par exemple parce qu'elle est authentifiŽe).
no-store
no-store
indique que la ressource ne doit pas tre stockŽe dans aucun type de mŽmoire
non volatile. Cela permet d'assurer le maximum de confidentialitŽ, hors
chiffrement.
must-revalidate
Indique
qu'un cache partagŽ ne doit renvoyer une ressource dont la date d'expiration
est dŽpassŽe qu'aprs avoir validŽ sa validitŽ auprs du serveur d'origine.
D'autres
directives encore plus prŽcises existent, que je vous invite ˆ aller dŽcouvrir
directement dans la RFC 2616 :
elles sont peu utilisŽes, et n'ont pas lieu d'tre dŽcrites ici.
Comment
utiliser les directives de cache?
Pour
vous Žviter des heures fastidieuses de recherche dans la littŽrature spŽcialisŽe
et sur internet, voici quelques infos pour rŽgler les directives de cache avec
Apache. Pourquoi Apache? Parce qu'il sert plus de 50% des pages web dans le
monde. Il aurait ŽtŽ un peu idiot de les faire pour lighttpd (le serveur web
que j'utilise pour mes sites), qui reprŽsente 0.005% des serveurs http. De
plus, Apache dŽfinit un peu le mode standard de rŽglage de tous ces paramtres,
Žtant lui mme conu et dŽveloppŽ par des dŽveloppeurs qui cherchent ˆ
respecter les standards, normes et recommandations.
Avec
Apache, on utilise deux modules diffŽrents pour modifier les enttes http concernant
le cache: le module expire et le module header. Vous devriez vous rŽfŽrer ˆ la
documentation de ces modules (http://httpd.apache.org/docs/2.0/mod/ ) pour
avoir le dŽtail de leur fonctionnement. Le premier module contr™le deux infos
des en ttes : Expires et Cache-Control: max-age . Le deuxime module permet de
manire gŽnŽrale de modifier les enttes http, nous nous en servirons pour
rŽgler l'entte Cache-Control de manire spŽcifique.
Ces
modules doivent tre activŽs dans votre configuration Apache. Ensuite, vous pouvez
utiliser leurs rŽglages de manire diffŽrente en fonction de vos besoins : dans
le fichier principal de configuration d'Apache, dans un autre fichier inclus,
rŽpertoire par rŽpertoire (section <Directory>), ou dans des fichiers
.htaccess si vous avez activŽ ce rŽglage. Je vous conseille de les tester
d'abord dans un fichier htaccess puis de les intŽgrer progressivement dans un
fichier de rŽglages spŽcifique en include du fichier de configuration
principal.
Expire
fonctionne avec les directives ExpiresDefault, ExpiresByType, ExpiresActive.
Technique
0
Comment
ne pas cacher
Pour ne
pas cacher, il faut rŽgler les enttes http Pragma et Cache-Control:
<Directory
"/home/website/cgi-bin/">
Header Set Pragma "no-cache"
Header Set Cache-Control "max-age=0, no-store, no-cache"
</Directory>
Technique
1:
Faites
un rŽpertoire avec les images qui changent tous les 10 ans et mettez des directives
agressives.
Il y a
peu de chances pour que votre logo change tous les 3 jours ou que certaines
images de votre site soient modifiŽes mme tous les mois. Ces ressources
peuvent tre cachŽes sans limite de durŽe par les caches, quels qu'ils soient.
N'hŽsitez pas ˆ ajouter des directives agressives du type :
-
mettre les ressources de ce rŽpertoire en cache avec une date d'expiration dans
10 ans
-
mettre toutes les ressources d'un type en cache avec une date d'expiration dans
10 ans
Pour le
premier cas, cela donne ceci:
<Directory
"/home/website/images/s">
Options FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
Allow from all
ExpiresDefault "access plus 10 years"
</Directory>
La deuxime
stratŽgie donne
<Directory
"/home/website">
Options FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
Allow from all
ExpiresByType image/gif "access plus 10 years"
ExpiresByType image/jpg "access plus 10 years"
ExpiresByType image/png "access plus 10 years"
ExpiresByType application/x-shockwave-flash "access plus 10 years"
</Directory>
Technique
2
Changez
le nom des ressources que vous voulez mettre ˆ jour. En effet, si vous utilisez
un cache de longue durŽe, il y a Žventuellement un risque que certains Žquipements
gardent les ressources en mŽmoire. Pour Žviter ce risque, vous devez changer de
ressource : en changeant de nom, vous mettez automatiquement ˆ jour la ressource.
Technique3
Mettez
un cache court pour s'adapter ˆ un parcours: une heure ou deux. Cela Žvitera
les revalidations. Cette technique est illustrŽe sur le test des deux pages
accessible sur cyrilgodefroy.com. Dans
ce cas, j'ai mis un cache de 1 heure sur toutes les ressources du rŽpertoire
cache1 : les fichiers html, les fichiers css, les images... Ce qui passe en
consŽquence c'est qu'au premier accs, on tŽlŽcharge tous les fichiers, et
qu'en arrivant sur la page 2 du test, on cherche ˆ tŽlŽcharger ˆ nouveau
uniquement le fichier html (et encore, seulement sous Firefox).
Le
cache n'est pas tellement utilisŽ
Le
rŽsultat de l'implantation des directives de cache peut sembler dŽcevant quand
on regarde la bande passante, et le nombre de requtes totales sur une
ressource censŽe tre cachŽe. Yahoo a rŽalisŽ et partagŽ une Žtude (http://yuiblog.com/blog/2007/01/04/performance-research-part-2/)
sur
la question. Cette Žtude montre que sur un site ˆ trs important trafic comme
Yahoo, mme sur une longue pŽriode, il reste 40% des utilisateurs qui arrivent
avec un cache compltement vide.
La mise
en place d'un trs bon cache reste toutefois essentielle pour des
parcours sans couture, utilisant au mieux les ressources d'un site web,
et rendant inutile le tŽlŽchargement systŽmatique des ressources. On doit pas
s'appuyer lˆ dessus en espŽrant que les visiteurs vont arriver avec un cache
rempli. Il faut faire en sorte qu'au cours d'un parcours, un minimum de
ressources soient rechargŽes et que les ressources communes soient parfaitement
cachŽes.
Cacheability
http://www.ircache.net/cgi-bin/cacheability.py
C'est
un outil automatique qui vŽrifie l'Žtat de chacune des ressources d'une page.
Cet outil ne fonctionne que sur internet et vŽrifie les en ttes http des
ressources d'une page. Il peut prendre un peu de temps ˆ fonctionner, car il
doit tŽlŽcharger et analyser chacune des ressources de la page que vous
soumettez, et qu'il le fait sŽquentiellement.
Son
principal dŽfaut se situe au niveau de l'analyse des fichiers css : il n'en
fait aucune.
Bien
sžr, vous pensez comme tout le monde qui a un peu de bon sens : ce qui prend du
temps c'est la construction de la page et le temps de chargement des objets qui
la composent (images, javascripts et autres). Vous seriez ŽtonnŽ de vous rendre
compte de la masse d'informations qui font le trajet inverse: de votre
navigateur vers le site web. Voici un exemple sur des parcours sur quelques
sites :
|
Site |
Upload |
Download |
|
|
1286 |
30105 |
|
Bouyges TŽlŽcom |
60037 |
692996 |
|
SFR |
107744 |
457038 |
|
Paypal |
54459 |
264946 |
Sur les
pages d'accueil en gŽnŽral pas de problme. Mais commencez ˆ rentrer dans le
coeur du sujet, ajoutez des articles dans votre panier et authentifiez vous :
vous verrez grimper votre trafic remontant vers le serveur.
Voici
par exemple le rŽsultat d'un parcours d'achat chez Amazon :
Download
852415
Upload
125708
(Achat
du premier produit trouvŽ sur une recherche, avec compte existant, mais sans
valider la commande).
GŽrer
ses cookies avec prŽcision par domaine et sous domaine
Un
cookie, c'est une information envoyŽe par le serveur web (en gŽnŽral par
l'application qui est derrire) au navigateur , et que ledit navigateur doit
ensuite renvoyer suivant certaines rgles. Les cookies sont utilisŽs partout :
pour la pub, pour l'identification, pour gŽrer un caddie, etc. Tout
ce qui suppose la persistance de la session ou de l'identification nŽcessite en
gŽnŽral un cookie. L'autre mŽthode pour identifier une session est un peu trop
compliquŽe ˆ mettre en oeuvre et pose des problmes de rŽfŽrencement de
contenu.
Le
cookie simplifie la vie du dŽveloppeur. Mais le dŽveloppeur se simplifie en
gŽnŽral trop la vie. Il peut en effet choisir certains paramtres pour le
cookie comme le nom de domaine auquel le cookie doit tre renvoyŽ par le
navigateur et le chemin. Inutile de dire que le dŽveloppeur choisira
normalement le domaine le plus large (yahoo.com ou cyrilgodefroy.com par
exemple) et le chemin lui ouvrant le plus de possibilitŽs (/ en l'occurrence).
Ce qui fait que toutes les requtes envoyŽes par le navigateur une fois que le
cookie est lˆ contiendront le mme cookie.
Un
cookie peut avoir diffŽrentes tailles : la taille d'un identifiant, la taille
d'un identifiant de session (plus gros), la taille d'un identifiant d'identitŽ
(encore plus gros). Donc la taille peut varier de 0 ˆ 1000 ou 2000 octets. Et
cette taille de cookie est reproduite ˆ chaque requte sur une ressource du
domaine et du chemin dŽfinis pour le cookie.
|
Site |
Taille de requtes |
|
Paypal |
1001 octets |
|
Yahoo |
356 octets |
|
|
438 octets |
|
TF1 |
292 octets |
|
Voila |
246 octets |
|
SFR |
385 octets |
|
Bouyges TŽlŽcom |
685 octets |
|
Orange |
357 octets |
|
MySpace |
452 octets |
Le
tableau ci-dessus montre que suivant les sites web , les requtes ont des
tailles diffŽrentes, pour certaines assez importantes (Paypal, BouyguesTelecom).
Pour
vous conforter dans l'idŽe que les cookies peuvent tre lourd, en voici
quelques uns:
-
MySpace
MYUSERINFO=;
domain=.myspace.com; expires=Wed, 19-Jan-2005 08:28:17 GMT; path=/ MYUSERINFO=;
domain=myspace.com; expires=Wed, 19-Jan-2005 08:28:17 GMT; path=/
MSCulture=IP=82.238.217.64&IPCulture=fr-FR&PreferredCulture=fr-FR&Country=FR&timeZone=0&ForcedExpiration=0&USRLOC=QXJlYUNvZGU9MCZDaXR5PVBhbGFpc2VhdSZDb3VudHJ5Q29kZT1GUiZDb3VudHJ5TmFtZT1GcmFuY2UmRG1hQ29kZT0wJkxhdGl0dWRlPTQ4LDcxNjcmTG9uZ2l0dWRlPTIsMjUmUG9zdGFsQ29kZT0mUmVnaW9uTmFtZT1BOA==;
domain=.myspace.com; expires=Sun, 15-Jul-2007 21:27:29 GMT; path=/
Je dis
bravo : deux fois le mme cookie, sur deux domaines diffŽrents...
- SFR
JSESSIONID=590A163AEEFD806BDE9ECEF37B3AF76F;
PSWsessionID=230925066.0.0000; s_cc=true; s_sq=%5B%5BB%5D%5D
-
Paypal
KHcl0EuY7AKSMgfvHl7J5E7hPtK=GgdN_CkjIZ241UgTtTkkyGHJM6UzLHab3odd6dWHW1uWus3ZMsh3BL3RK8-YwzEvSzZ0Ay9BEsomyLjW;
cookie_check=yes;
s_pers=%20s_favsn_paypalglobal_1%3D7628769626047%7C1499205713501%3B; login_email=...;
upct=96; Apache=8////.....20999118236932791;
SzWDZL1Tw4729rjVwzEIbk4eZ7u=CMZp3C6FrsJHDUEHRNykHszAfPrEUljq34IlvDlbUJxmO40wLsydPieCiNt_JSEZKXB6VnSMyNRd1OTTU_KLHTI-6k9asA1UZ3XKux2G;
OL6S9fXi8y9NkAzRyU8cgsycszO=FE-j1sUlASmKiFjgOnM69JHCw0AXPa-tVDGQm9D4V5Uz4TNYBRlJnG3jQM9kYPRg6GGqIY0VVpyIWjW47xCZeyJUnxro4_z2j_2sv6Z1N8lfB21P;
s_sess=%20s_cc%3Dtrue%3B%20s_refresh%3DHomepage%257E%255B1%255D%3B%20s_sq%3Dpaypalglobal%253D%252526pid%25253DHomepage%252526pidt%25253D1%252526oid%25253DLog%25252520In%252526oidt%25253D3%252526ot%25253DSUBMIT%3B;
HaC80bwXscjqZ7KM6VOxULOB534=9uS_zYnvvEWYb_Ji7k7TDu3-UTNooFTK_h4M7JCWs-YMRfLDTX83BOGFgvEnJB0b-DkUWtrGh-nLXzaptAua3CI8Et8lndlp31CFTvr9RFhdjRXjsti3raztZg704vksJ5cWBG;
cookie_contact_phone=; cookie_welcome=
-
Google
PREF=ID=a4abafc91afcc710:TM=1176054507:LM=1176054507:S=MQ0FDkekAB16M1PV
Comment
se dŽbarasser des cookies
Il est
plus facile pour un dŽveloppeur de crŽer un cookie que pour vous de vous en dŽbarasser
: une fois que ce genre d'information existe, il a tendance ˆ se rendre indispensable
et ˆ conserver son emprise. On ne peut donc pas se dŽbarasser des cookies comme
cela. Il faut Žviter au maximum de les utiliser avant de les enlever.
La
deuxime mŽthode ˆ utiliser est de ne mettre les cookies que sur des sous domaines
trs prŽcis, par exemple www.yahoo.com, ou
mail.google.com. Ainsi quand on va sur movies.yahoo.com ou ww.google.com, on
n'envoie pas ces cookies avec la requte. Si on crŽe un sous domaine img pour
hŽberger uniquement les images (par exemple), les requtes envoyŽes vers ce
serveur img.monsiteweb.com ne contiendront pas de cookie dŽposŽs sur www.monsiteweb.com.
La
troisime mŽthode consiste ˆ se crŽer un autre domaine pour servir les images
et les ressources statiques. C'est dans le cas ou vous ne pouvez vraiment pas
vous passer de mettre un cookie sur l'intŽgralitŽ du domaine, sur
*.monsiteweb.com. Cette mŽthode pose d'autres problmes : alertes de sŽcuritŽ
qui peuvent survenir pour vous prŽvenir de cross site scripting (une technique
de hacker pour passer des infos d'un site ˆ l'autre). Par exemple sfr a s-sfr,
et yahoo a yimg, quant ˆ wanadoo-Orange, ils ont woopic (?!).
Enfin,
on peut demander ˆ un CDN de venir ˆ la rescousse pour distribuer vos fichiers
les plus lourds et les fichiers images ˆ votre place, et ainsi rŽduire
nettement votre facture ÔcookiesÕ. On reviendra sur les CDN plus tard.
Un
facteur que certaines personnes ont tendance ˆ oublier : Faire un site au
protocole https est compliquŽ et lourd. Un site https aura par ailleurs
tendance ˆ consommer plus de ressources serveur et client et plus de bande
passante (ˆ cause du chiffrement des donnŽes). Si vous envoyez des requtes
lourdes ˆ cause des cookies, celles ci seront encore plus lourdes ˆ cause du
chiffrement.
Le
https cÕest le mal
Faire
intervenir un changement de protocole au milieu dÕun parcours peut tre dramatique
pour la performance de celui ci: tous les efforts faits dans les pages
prŽcŽdentes pour cacher le contenu sont rŽduits ˆ nŽant car les ressources ont
une adresse diffŽrente (https://www.monsiteweb.com/ressource1.gif au
lieu de http://www.monsiteweb.com/ressource1.gif), car
on demande au serveur et au navigateur de chiffrer et de dŽchiffrer toutes les
ressources, car lÕon chiffre toutes ses requtes aussi (le chiffrement se fait
dans les deux sens).
JÕai
vŽcu lÕexpŽrience personnelle de changement de protocole sur des parcours, et
le rŽsultat Žtait systŽmatique : 100% des mesures sur les pages de changement
de protocole Žtaient hors seuils (et pas quÕun peu).
Le
https est indispensable
Je vous
rappelle dÕabord la loi : Tout responsable de traitement informatique de donnŽes
personnelles doit adopter des mesures de sŽcuritŽ physiques (sŽcuritŽ des locaux)
et logiques (sŽcuritŽ des systmes dÕinformation) adaptŽes ˆ la nature des donnŽes
et aux risques prŽsentŽs par le traitement.
Le
non-respect de lÕobligation de sŽcuritŽ est sanctionnŽ de 5 ans
d'emprisonnement et de 300 000 Û d'amende. (art. 226-17 du
code pŽnal)
Seules
les personnes autorisŽes peuvent accŽder aux donnŽes personnelles contenues
dans un fichier.
La
divulgation dÕinformations commise par imprudence ou nŽgligence est punie de 3
ans d'emprisonnement et de 100 000 Û dÕamende. (art. 226-22 du
code pŽnal).
Evidemment,
la CNIL nÕa pas les moyens de faire respecter ces lois et directives.
Utiliser
le protocole https est donc indispensable:
- Le
certificat que votre serveur vous authentifie et prouve votre identitŽ. Quand
on sait ce qui peut se passer sur internet, et qu'on conna”t l'ingŽniositŽ des
escrocs, on se mŽfie.
- il y
a des informations que votre visiteur vous envoie qui doivent rester secrtes:
mot de passe, numŽro de carte bleue...
- vous
devez prŽserver l'identitŽ de vos client et protŽger leurs donnŽes. C'est une
obligation lŽgale qui si elle n'est pas respectŽe vous expose ˆ des poursuites
pŽnales. Donc ds que vous affichez des donnŽes personnelles (adresse, nom,
points, facture...), vous devez chiffrer le trafic.
Pas
question dans ses conditions de se passer du https. Il faut donc se poser la
question de l'amoindrissement de son impact et des raisons pour lesquelles il
ralentit autant vos pages.
GŽrer
des ressources rares
En
allant visiter les pages de tests avec une connexion sŽcurisŽe ˆ https://cyrilgodefroy.com/fr/testqos/, on
peut dŽcouvrir ou valider certains faits concernant l'usage du https.
Avant
que vous ne vous jetiez sur l'url, sachez que je n'ai pas de certificat
contresignŽ par une autoritŽ de certification: si vous tes sŽrieux, vous ne
faites pas entirement confiance aux requtes que vous ferez. Rien de secret
entre nous toutefois: vous pouvez accepter ce certificat, au moins pendant la
session.
https
= pas d'astuces d'amŽlioration
Le
https fait Žchec ˆ certaines mesures d'amŽliorations que nous avons ŽvoquŽes:
- le
cache est considŽrŽ comme non sŽcurisŽ sur le disque. Il a en effet pu tre
touchŽ en dehors de la connaissance du navigateur. Donc le navigateur ne met
pas en cache les ressources sŽcurisŽes sur le disque. Cela ne veut pas non plus
dire qu'il recharge tout ˆ la fois: il y a un cache de session en mŽmoire vive.
Quand vous fermez le navigateur, tout dispara”t.
- il
est dŽconseillŽ d'utiliser diffŽrents sous domaines, voire diffŽrents domaines.
Dieu merci, cette recommandation n'est pas bloquante: vous pouvez continuer ˆ
servir des images depuis un nom de domaine qui n'a pas de cookie.
- il y
a peu de connexions sur internet explorer: pas de parallŽlisation du tŽlŽchargement
des ressources. En tout cas, moins
Comment
rŽduire lÕimpact des pages https
Tout
dÕabord, il faut que vous vŽrifiiez que votre plate forme https est ˆ la
hauteur : cartes accŽlŽratrices, choix du package de sŽcuritŽ SSL, etc jouent
ŽnormŽment dans la performance pure de votre chargement dÕŽlŽments en protocole
https. Comparez alors la vitesse de chargement dÕune page en http et une page
en https.
Ensuite,
vous pouvez minimiser l'impact du passage du http au https gr‰ce ˆ plusieurs
techniques et dans certaines situations.
Des
frames? Oui encore un peu, merci..
La
premire technique, hŽritŽe des annŽes 90, est d'utiliser des frames: mettez
vos ŽlŽments de navigation dans une frame ou plusieurs frames, par exemple en
haut et en bas de votre page, et servez ces pages en mode http. Limitez l'usage
du https au contenu qui a besoin d'tre protŽgŽ pendant le transfert et faites
que toute la frame et toutes ses ressources soient en https.
Plusieurs
inconvŽnients ˆ cette technique. Tout d'abord, toute la page n'est pas sŽcurisŽe,
et le navigateur le montrera avec quelques indicateurs, dont le cadenas
(cassŽ).
ensuite,
c'est des frames, avec tout ce que cela implique de difficultŽs, dÕŽnervement
et de travail inutile et bte.
In
fine, ce n'est pas une bonne solution.
Faire
des redirections
La
technique suivante pour limiter les pages https est d'utiliser des redirections
client aprs les formulaires fournis en https pour revenir en http : un
formulaire d'authent par exemple n'a pas besoin d'tre sur une page https, mais
il faut que la requte POST quand on clique sur OK soit en https. Ensuite on
peut faire une redirection client pour revenir sur du https. C'est par exemple
ce que fait bytel.
Est ce
que tout ce qui doit tre sŽcurisŽ l'est bien avec cette technique? Vous seuls
pouvez le dire... et la CNIL.
Les
vraies techniques qui vont permettre de rŽellement amŽliorer votre affichage en
https sont les mmes que pour le http:
- peu
d'ŽlŽments par page, notamment css et js
- des
cookies de petite taille en allant chercher des ressources sur un domaine ou un
sous domaine diffŽrents de celui qui cre les cookies.
- un
cache et des directives efficaces et une utilisation intelligente de vos
ressources. Le cache session n'est pas un vain mot. Exploitez le ˆ fond.
Faites
des pages hyper simples en https. Au mieux pour une page en https, il suffit
d'une ressource : la page. Je suis sur que vous pouvez en avoir une qui
s'affiche en moins de 1 seconde, https compris. Alors la prochaine fois qu'un
designer vous fait une page d'espace client, de paiement, etc, dŽsinstallez
photoshop et illustrator de son ordinateur avant qu'il commence, ou fixez lui
des rgles trs strictes en appelant ˆ son intelligence: il n'est normalement
pas lˆ pour vous mettre des batons dans les roues.
Comment
fonctionne la compression?
Une des
premires solutions pour rendre un site web plus rapide que les dŽveloppeurs me
citent, c'est cette solution, de compression du contenu. Je ne sais pas d'o a
vient, quelle est cette maladie... Non je rigole.
Le
fonctionnement est le suivant : plut™t que de faire passer sur le rŽseau un
fichier de plusieurs dizaines de kilo octets, le serveur web le compresse, et
envoie une instruction au navigateur pour que celui ci sache que le fichier
doit tre dŽcompressŽ. Le navigateur dŽcompresse alors le fichier qui redevient
tout ˆ fait normal.
On peut
faciliter la vie du serveur en compressant ˆ l'avance les fichiers. La charge
pour celui ci est alors rŽduite. Par exemple, le module compres de lighttpd
conserve des versions compressŽes des fichiers quÕil envoie.
Le
WebInspector de Safari note les ressources qui pourraient bŽnŽficier de ce mode
de compression avant transmission pour vous prŽconiser de les compresser.
Quels
ŽlŽments compresser
Il
n'est pas astucieux de compresser tous les ŽlŽments qui sont envoyŽs par le
serveur. Je vous rappelle que la compression est une opŽration mathŽmatiquement
exigeante qui prend du temps processeur : compresser tous les ŽlŽments sur un
serveur ˆ fort trafic augmente donc encore la charge sur ce serveur.
Par
ailleurs, les ŽlŽments qui sont dŽjˆ compressŽs ne gagnent rien ˆ tre encore
compressŽs. Parfois mme, le fichier compressŽ est lŽgrement plus gros que le
fichier d'origine! Les fichiers qui sont dŽjˆ compressŽs (gif, jpeg, png,
swf... notamment) ne doivent donc pas tre compressŽs. Il faut limiter la
compression aux ressources qui sont au format texte : html, css et javascript.
Tous
les navigateurs ne sont pas Žgaux devant la compression http : il existe en
effet deux modes de compression, et tous les navigateurs ne les implŽmentent
pas, voire certains ont des bugs dans leur implŽmentation. Premier ŽlŽment, le
navigateur doit dire au serveur s'il accepte la compression dans les enttes :
il utilise l'instruction Accept-Encoding : gzip, deflate. Certaines versions de
Netscape Navigator 4 disent supporter la mŽthode zlib alors qu'ils ne le font
pas, etc : cÕest une zone de configuration assez dŽlicate, et qui souffre de
nombreux Žcueils.
Par
exemple, des fichiers PDF n peuvent pas tre compressŽs car ce nÕest pas le navigateur
qui les exploite, mais directement le lecteur PDF, qui ne sait pas dŽcompresser
des fichiers.
Enfin,
la plupart des navigateurs ne lisent les fichiers compressŽs que sÕils ont
explicitement demandŽ ˆ en avoir.
Comment
compresser avec Apache
On peut
compresser ˆ plusieurs niveaux. On peut compresser par le serveur web, par le
serveur dÕapplication ou le langage de script.
Comme
plus haut pour les directives de cache, je vais prŽsenter la configuration qui
peut tre mise en place avec Apache 2, car cÕest certainement le serveur web le
plus utilisŽ.
Apache2
vient avec un moduel spŽcifique pour la compression, le module mod_deflate. Celui
ci est utilisŽ en appliquant la directive
SetOutputFilter DEFLATE
Ce
module fonctionne ensuite par inclusion de certains types de ficheirs,
exclusion de fichiers, et peut aussi travailler avec des BrowserMatch (pour
identifier des navigateurs un peu grincheux).
Voici
une configuration typique:
<Location
/>
SetOutputFilter DEFLATE
DeflateCompressionLevel 9
SetEnvIfNoCase
Request_URI \
\.(?:gif|jpe?g|png)$ no-gzip dont-vary
SetEnvIfNoCase
Request_URI \
\.(?:exe|t?gz|zip|gz2|sit|rar)$ no-gzip dont-vary
</Location>
Toute
cette compression peut avoir un impact sur la performance de votre serveur
web : compresser peut en effet utiliser une part importante de vos
ressources machine.
Compresser
avec PHP
Php
bŽnŽficie d'un module de base pour compresser le contenu qui est renvoyŽ en
html. Votre php doit tre compilŽ avec le module zlib qui va bien. Vous pouvez
utiliser la commande phpinfo pour avoir une page web vous indiquant tous les
modules compilŽs dans voter php. Pour utiliser ce module, il suffit de
l'appeler :
<?php
ob_start(
'ob_gzhandler' );
?>
Comme
il faut compresser toute la rŽponse et positionner cette instruction en
premier, faites attention ˆ positionner cette instruction en haut de page.
Vraiment au premier caractre.
Compresser
(minifier) les ressources javascript
Le
javascript est rempli de vide et de contenus inutiles. Si,si. CÕest un fait que
tous les langages, avec les commentaires, les retours chariot, les espace etc,
sont remplis de rien, mais de rien qui a du poids.
Or
envoyer des contenus qui ont un poids trop important est inutile. On va donc essayer
de rŽduire la taile des javascripts.
Il
existe pour ce faire un programme souvent citŽ pour sa simplicitŽ
dÕutilisation, lÕefficacitŽ du rŽsultat obtenu (compression de 10 ˆ 50% de la
taille), et le fait que lÕon peut toujours lire le code mme une fois quÕil est
minifiŽ.
DÕautres
programmes peuvent tre utilisŽs, comme celui qui vient avec dojo, ou dÕautres
qui brouillent le contenu du code. Leurs rŽsultats pour le moment sont moins
bons.
JSMIN, The JavaScript Minifier (http://www.crockford.com/javascript/jsmin.html)
CDN
ques aquo?
Un CDN
est un Content Delivery Network, un rŽseau de livraison de contenu, une enrteprise
qui a crŽŽ son propre rŽseau ˆ lÕintŽrieur dÕinternet pour tenter de rapprocher
le contenu des utilisateurs. Ces entreprise sont apparues dans les annŽes 90,
et ne sont pas trs connues du grand public, mais sont souvent utilisŽes par
les gros groupes pour rendre possible et efficace la diffusion de gros contenus
aux utilisateurs.
Le
principe est simple : offrir un cache du contenu le plus proche possible de
lÕutilisateur final. La rŽalisation de cet objectif est moins simple, puisquÕil
faut dŽterminer quel serveur est proche de lÕinternaute, comptabiliser la
requte (pour tre payŽ et conna”tre le trafic), rapatrier le bon fichier au
bon moment (mieux vaut trop t™t que trop tard), gŽrer sa durŽe de vie etc.
Ces
fonctionnalitŽs font quand mme quÕutiliser les services dÕun rŽseau de
distribution de contenu est rŽservŽ aux sites ˆ trs fort trafic et ayant des
ressources importantes.
Je connais de nom 3 rŽseaux :
Akamai, Savvis et Limelight Networks. NÕayant pas eu la chance de bŽnŽficier de
leurs services, je ne peux pas faire de recommandation. Par contre, vous
trouverez des utilisateurs de ces rŽseaux en France, comme LibŽration.
Nous
avons vu de manire gŽnŽrale les outils ˆ disposition, les erreurs les plus frŽquentes,
les techniques pour amŽliorer le temps d'affichage, mais qu'est ce qui va vous
faire gagner du temps ˆ vous? Comment allez vous procŽder?
Fixer
des objectifs rŽalistes
Vous
n'arriverez pas ˆ afficher en 4 secondes une page contenant 300 images et faisant
appel ˆ beaucoup d'ŽlŽments Ajax ou simplement ˆ du javascript un peu coton.
Vous n'arriverez pas non plus ˆ empiler toutes les fonctionnalitŽs que vous
dŽsirez dans le design et le look and feel que vous voulez sans souffrir un peu
sur le temps d'affichage (car aprs tout il faut beaucoup de ressources pour
faire un joli site). Il faudra que vous fassiez la part des choses et que vous
vous fixiez des objectifs rŽalistes
Il y a
quelques annŽes, on considŽrait qu'une page devait se charger (ou au moins
commencer ˆ appara”tre) en 2 secondes. Ce prŽcepte est toujours assez vrai. Je
l'Žtendrais en disant qu'il faudrait qu'une page s'affiche en 5 secondes
compltement. On peut augmenter ce seuil pour des pages qui deviennent
compliquŽes, mais dans ce cas il faut les prŽvoir et mettre une temporisation
rendant plus agrŽable ou plus perceptible le fait que le site fonctionne, et
qu'il fait quelque chose de dur.

Paypal cherche ˆ se souvenir du
solde ˆ 9 chiffres de mon compte, cela prend du temps, mais je suis prŽvenu.
Ces
objectifs doivent porter sur les pages d'accs ˆ votre site web (home
mais aussi pages d'accueil de catŽgories lors de promos ou de pubs), et sur les
parcours complets qu'il y a derrire : c'est moins grave si votre page
d'accueil met 6 secondes ˆ se charger si cela vous permet derrire de fournir
les autres pages en moins de 3 secondes.
Ces
objectifs doivent surtout porter sur les pages d'accs aux services : accueil,
accs au compte etc. Cela ne sert ˆ rien d'avoir des pages derrire la page
d'accueil qui se chargent en 3s si les utilisateurs sont partis sur la home car
elle Žtait trop lente.
Est ce
que je viens de dire deux choses qui allaient dans des directions contraires?
C'est pour vous dire qu'il faudra revoir vos objectifs en fonction des
rŽsultats et des succs que vous aurez obtenus.
Le
critre qui vous permettra de vous positionner par rapport au temps de
chargement d'une page, c'est son poids total : si elle est trs lourde (plus de
700Ko), aucun espoir de descendre sous les 4 secondes.
Rassembler
les donnŽes des parcours les plus importants
Il faut
que vous vous restreignez : vous ne pourrez pas obtenir rapidement des rŽsultats
magiques sur toutes les pages. Il faut donc travailler en premier lieu sur les
parcours les plus importants. Plus importants parce qu'ils sont quotidiens pour
vos utilisateurs, ou plus importants parce qu'ils font du business : ils sont
critiques car il s'agit de l'achat, de l'inscription, etc.
Ensuite,
rassemblez les donnŽes : non pas un parcours, pas 10, mais 50 ou cent. Vous ne
pouvez pas baser vos analyses sur des tests unitaires. Construisez vos parcours
en numŽrotant les pages, en faisant des captures des pages par lesquelles vous
devez passer, de manire ˆ toujours effectuer le mme parcours. Au dŽmarrage de
chaque parcours, videz votre cache, effacez vos cookies et relancez votre
navigateur pour vous mettre dans la peau de votre internaute.
Construisez
un tableau de rŽsultats avec le temps d'affichage complet de chaque page du
parcours. Notez les infos au fur et ˆ mesure. Pour dŽterminer le temps
d'affichage d'une page, comptez ˆ partir du moment o vous actionnez le lien,
et ne vous fiez pas aux chronos qu'on peut trouver avec les navigateurs : ceux
ci peuvent se remettre ˆ zŽro au cours de l'affichage d'une page.
Prenez
des traces de vos parcours, pour pouvoir les analyser a posteriori. L'outil
que je vous conseille pour cela est HttpWatch : les traces conservŽes sont
rŽutilisables telles quelles. Les traces prises avec TamperData sont moins
lisibles aprs coup. Sauvegardez au fur et ˆ mesure les traces de vos mesures
de parcours en utilisant le nŽmero du tests que vous venez d'effectuer.
Une
fois que vous avez des traces consŽquentes sur votre parcours, concentrez vous
sur les pages les plus lentes ˆ afficher en moyenne : faites une moyenne du
temps d'affichage des pages d'un parcours, et prenez les plus lentes. Allez
ensuite vŽrifier les traces http de ces pages. Http Watch rouvre les fichiers
de type hwl, alors vous pouvez conserver toutes vos mesures sous ce format, qui
est plus complet et peut Žventuellement vous permettre d'aller voir aussi les
requtes, rŽponses et les headers.
Voici
ensuite les choses que vous devez aller vŽrifier.
1.
RepŽrer les pages de type text/html qui prennent du temps
2.
Faites la chasse aux redirections
3.
Comparez la taille des requtes et leur nombre ˆ la taille des rŽponses
4.
VŽrifiez qu'au cours d'un parcours les ressources sont servies par le cache
5. Page
par page, vŽrifiez quelles ressources sont tŽlŽchargŽes en premier
6.
Identifiez les pages qui doivent tre refondues
RepŽrez
les pages de type text/html qui prennent du temps
Certaines
pages sont infailliblement lentes : elles font appel ˆ un systme distant,
elles crent un raport dans un format inhabituel pour le web, elles sont mal
conues... Ces pages doivent tre dŽbusquŽes dans les situations rŽelles (et
pas seulement dans la phase de dŽveloppement). Elles devraient dŽjˆ tre
connues du dŽveloppeur ou de l'intŽgrateur de la prtie applicative du site. Si
il n'est pas capable de vous les citer, vous pouez faire la liste pour lui.
Tout ce qui dŽpasse une seconde en moyenne est suspicieux, tout ce qui dŽpasse
les 3 secondes est carrŽment trop lent.
Comment
agir face ˆ ces pages? Suivant les justifications qui peuvent tre faites, vous
avez deux options :
si les
systmes derrire sont rŽellement complexes (systme de rŽservation de transports
aŽriens, catalogues de prix de plusieurs sites web...), vous devez traiter
l'attente comme quelque chose d'inŽluctable et prŽvenir l'internaute de celle
ci. La capture de la page Paypal est un bon exemple.
si la
page est lente alors qu'elle ne devrait pas l'tre d'aprs le dŽveloppeur,
renvoyez le vŽrifier son code et ses flux sur la production. Les flux doivent
tre de bout en bout : depuis l'entrŽe de la requte dans l'infrastructure
d'hŽbergement jusqu'au renvoi de la rŽponse ˆ la sortie de cette infrastrucutre
en passant par les requtes aux bases de donnŽes.
Faites
la chasse aux redirections
Une
faon assez nulle de perdre du temps que l'on rencontre trop souvent est la redirection.
Toutes les requtes ayant pour rŽponse des codes 300 et quelques (essentiellement
302 et 301) sont des redirections. Ces redirections s'insrent de purement
sŽquentielles dans le chargement de vos pages : impossible d'accŽder ˆ la page
finale sans passer par les pages de redirection et de subir le temps de rŽponse
de ces pages.
L'existence
de ces redirections n'est pas forcŽment innocent, motivŽ par la volontŽ de
protŽger l'application d'utilisateurs qui soumetraient plusieurs fois le mme
formulaire, ou de leur Žviter une navigation en protocole https sŽcurisŽ
inutile. Le problme est quand les redirections sont au nombre de deux ou plus
successivement, ou quand elles pallient des mauvaises configurations.
Par
exemple, on accde souvent aux url sans taper le / de fin pour indiquer l'accs
ˆ un rŽpertoire. Le navigateur rŽpond alors par une redirection. Or on peut le
forcer ˆ rŽpondre directement sans effectuer la redirection. Evitez vous 400ms
de round trip totalement inutile.
Comparez
la taille des requtes et des rŽponses
Dans
HttpWatch, il y a un onglet 'summary' qui fait automatiquement le travail de somme
du poids des requtes et du poids des rŽponses. Vous pouvez aussi copier le
contenu des colonnes dans un tableur, faire vous mme la somme des colonnes requtes
et rŽponses. Cette somme vous permet d'avoir une premire apprŽciation du
trafic entre votre navigateur et le serveur dans les deux sens.
Si vos
requtes sont supŽrieures en poids aux rŽponses, il y a un problme Žvident
(sauf dans le cas d'un upload). Si vos requtes dŽpassent 10% de vos rŽponses,
il faudra faire la chasse aux requtes trop lourdes.
La
vision synthŽtique ne doit pas vous empcher d'aller faire le mme travail dans
le dŽtail sur une page. Vous verrez assez vite les requtes de statistiques et
de publicitŽ : ce sont souvent les plus lourdes. Vous verrez si vous risquez
d'avoir un problme ˆ cause de la taille des requtes assez vite. Ne sous
estimez pas l'influence de ce facteur : il n'est peut tre pas Žvident sur
votre copnnexion en cÏur de rŽseau 100 Mb/s, il est plus Žvident sur une
connexion ADSL ˆ 1 Mb/s assymŽtrique disposant de 128 Kb/s sur le sens montant
(du navigateur vers le serveur).
VŽrifiez
l'usage du cache
Cette
recommandation suppose que vous avez mis en place des directives de cache,
Žvidemment. Si vous n'en mettez pas, ne vous attendez pas ˆ des miracles de ce
c™tŽ. Le navigateur fera du best effortÉ mais celui ci peut tre trs limitŽ.
Par contre vous devez vŽrifier que vos directives de cache sur vos ressources
statiques sont bien transmises, qu'elles sont appliquŽes et qu'elles sont
efficaces.
L'efficacitŽ
se traduit dans HttpWatch par ce mot magique : (Cache) et par le chiffre qui va
avec : 0. Il peut aussi se traduire par une ligne absente. Si vous avez une
page avec votre logo mais que vous ne voyez pas de requte pour celui ci, tout
va bie : il vient du cache.
Par
contre si vous voyez ces codes : 200 ou 304, c'est que vous n'avez pas bien
fait votre travail, juste ˆ moitiŽ. Pourquoi ˆ moitiŽ? Parce que le navigateur
ne croit pas en la validitŽ de la ressource dont il dispose. Il a donc besoin
de revalider celle ci. Cela nous pose deux problmes de performance : un
parce que l'on refait un roundtrip (une boucle requte rŽponse), et que ce
roundtrip peut tre sur un fichier bloquant (type javascript). Deux parce que
chaque requte pse, bien entendu... Vous devez regarder dan sle dŽtail les
requtes et rŽponses sur la ressource en question :
¥la
durŽe du cache est elle bonne
¥y
a-t-il une directive du type must-revalidate
¥y
a-t-il un cookie envoyŽ dans la requte de la ressource
Quelles
ressources sont tŽlŽchargŽes en premier?
L'ordre
de tŽlŽchargement des ressources a une importance grande, on lÕa dŽjˆ vu.
Surtout les ressources de type javascript (mais pas seulement). Commencez par
vŽrifier que les css sont chargŽs en premier. S'il y en a trop (plus de deux),
vous pouvez noter de faire un progrs de ce point de vue.
Ensuite
vŽrifiez l'usage du javascript. Le tŽlŽchargement d'un fichier externe
javascript au milieu du corps de la page doit tre proscrit. Le mieux serait de
le charger ˆ la fin (mme si ce n'est pas toujours possible). En effet comme
cela il ne bloque pas le chargement des autres ressources. Au pire, essayez de
rassembler les fonctions dans un ou deux fichiers javascript, un pour les
fonctions statiques et un deuxime pour les fonctions dynamiques, puis utilisez
ces fonctions par l'usage de javascript inline, c'est ˆ dire du javascript
directement dans le html.
VŽrifiez
que vous n'avez pas d'aberrations dans le chargement : @import dans les fichiers
css de style, des fichiers javascript et css intercalŽs les uns avec les
autres.
Au fur
et ˆ mesure que vous vŽrifiez ces ressources texte statiques, vŽrifiez qu'elles
sont minifiŽes (pour les javascripts) et passŽes en gzip ou en deflate
(compression) pour toutes les ressources texte. Le WebInspector de Safari vous
signale rapidement toutes les ressources qui pourraient bŽnŽficier de
compression mais n'en ont pas.
Identifiez
les pages qui ont besoin d'tre refondues
Certaines
pages ne passeront jamais sous le seuil que vous leur avez fixŽ ˆ la base : il
est mme impossible qu'elles le fassent en sortie de plateforme d'hŽbergement.
Ces pages sont simplement trop lourdes, trop compliquŽes en nombre d'ŽlŽments ˆ
charger, trop compliquŽes en structure (tableau dans un tableau dans un tableau
...).
Ne vous
Žreintez pas avec ces pages. Sachez les identifier rapidement pour y revenir
plus tard. Elles vont juste rŽussir ˆ Žpuiser vos ressources, votre patience et
votre ingŽniositŽ, et vous n'arriverez pas ˆ un bon rŽsultat. Dans ce cas, vous
tes perdant. Concentrez vous d'abord sur les pages les plus faciles ˆ
corriger. Vous y gagnerez plus avec celles ci en gratificaion immŽdiate.
Les
pages les plus dures, n'hŽsitez pas ˆ les remettre sur la planche ˆ dessin :
planche ˆ dessin graphique, html, applicative, ergonomique. Changez leur seuil
pour fixer un objectif rŽaliste : une page de 900 Ko pour 100 ŽlŽments
mettra fatalement plus de 5 secondes ˆ se charger sur une connexion ˆ 1 Mb/s (800/(1024/8)
= 7 s au mieux pour un fichier unique).
Votre
page d'accueil est certainement le premier contact que font les internautes
avec votre site. Or on n'a qu'une seule chance de faire bonne impression : il
n'existe pas de deuxime premire rencontre. Votre premier objectif de
superperformance est donc d'avoir une home qui fait snap!
J'ai
rencontrŽ plusieurs personnes qui ne voyaient la home que comme la premire
page d'un parcours. A ce titre ils pensaient qu'elle devait avoir la mme
apparence et la mme construction que les autres pages, motamment pour
"mettre dans le cache les ŽlŽments ˆ rŽutiliser sur les autres
pages".
Foutaises!
La page
d'accueil de votre site est la plus importante et la plus spŽciale. Elle doit
tre traitŽe comme un joyau unique et mŽrite tous vos efforts. Souvent elle
sera la seule page visitŽe de votre site. Mme s'il repart, l'internaute doit
rester sur une bonne impression. Alors ne la traitez pas comme les autres
pages.
Encore
une fois, inspirez vous des meilleurs. Regardez la home de Google, 2 fichiers
et 94 ms. Moins de temps qu'il ne faut pour se rendre compte qu'on a appuyŽ sur
entrŽe. Vous allez me ressortir: oui mais c'est un moteur de recherche, c'est
pas pareil. SI. Un fichier html et une image: c'est tout ce qu'il faut charger.
Regardez
la home de Yahoo, si vous n'tes pas convaincu. Ne me dites pas qu'elle est
comme celle de Google: des images, des blocs, des photos, de la pub. De la pub
avec de la vidŽo! Si vous trouvez quelque chose de moins performant en web 1.0,
dites le moi. Les mmes rgles de construction sont appliquŽes.
Tout
envoyer en une requte
On l'a
vu tout au long des pages prŽcŽdentes: demander des fichiers ˆ charger, c'est
bien trop long, et il faut faire son possible pour Žviter toute requte
supplŽmentaire.
On peut
envoyer moins de choses, allŽger les choses, ou tout envoyer en une fois. C'est
ce qu'on essaie de faire avec le pipelining: envoyer plus de contenus dans la
mme requte.
Pour
notre page d'accueil, nous allons donc rassembler tous les fichiers qui peuvent
l'tre: html, css et javascript. Plusieurs images deviendront une seule image.
Prenez
votre Žditeur de texte, ouvrez votre home et votre feuille destyle, votre javascript
(vous ne devriez dŽjˆ plus en avoir qu'un). Puis intŽgrez ces deux fichiers en
interne :
Vous
venez de gagner deux requtes, sŽquentielles qui plus est.
Ensuite,
si votre design et votre animation Žditoriale le permettent, agrŽgez plusieurs
images en une. Par exemple, les catŽgories du menu de gauche de la page
d'accueil de Yahoo! sont une seule image.
Vous
n'tes pas obligŽs de faire une grosse image map, vous pouvez aussi utiliser
des sprites css (http://www.alistapart.com/articles/sprites). Cette
technique vous permet dÕutiliser une grosse image contenant de nombreux
ŽlŽments ˆ afficher , et dÕafficher juste une partie de cette image, un carrŽ ˆ
lÕintŽrieur de celle ci.

Les
icones de Yahoo sont toutes dans un seul fichier image ou presque..
Un
exemple des rŽsultats en appliquant une partie des recommandations, et sans
faire de nettoyage dans les scripts ou les styles:
http://cyrilgodefroy.com/fr/testqos/snap/avant.html
http://cyrilgodefroy.com/fr/testqos/snap/apres.html
On n'a
pas beaucoup ŽvoquŽ les applications web 2.0, utilisant ˆ foison les interfaces
riches construites gr‰ce aux scripts javascripts comme prototype, JSON,
scriptaculous, DOJO, etc. Et pour cause : ces applications sont plut™t
nouvelles et peu de gens rŽalisent aujourd'hui de telles choses. C'est le
travail de spŽcialiste ˆ l'intŽrieur du travail de spŽcialiste.
Il ne
faut pas trop s'inquiŽter de ces applications : les rgles qui prŽvalent ˆ
l'existence de pages trs performantes sont les mmes pour les applications web
2.0. (et 3.0 ) : le javascript se chargera toujours sŽquentiellement, les css
aussi sur Firefox, les requtes sont aussi lourdes. En Žtant rigoureux comme
pour une application normale, vous obtiendrez des temps d'affichage Žquivalents
et aussi bons.
Deux
diffŽrences mŽritent notre attention : le principe d'une application riche embarquŽe
dans le navigateur, utilisant une seule page pour fonctionner fait dispara”tre
la notion de temps d'affichage des pages. Quand j'arrive sur ma page
docs.google.com, mon webmail yahoo ou netvibes, j'ai peut tre un temps d'affichage
un peu plus important, mais je suis prŽvenu et je n'ai ce temps de chargement
qu'une fois. Le reste du temps, toutes mes requtes ˆ l'application ont un
temps d'exŽcution assez rapide, sans doute beaucoup plus rapide que si j'Žtais
passŽ par un cycle requte/rŽponse complet.
L'autre
diffŽrence concerne le XmlHttpRequest : ce dr™le d'objet qui sert ˆ faire de
l'Ajax (du chargement asynchrone de pages web) ne se comporte pas tout ˆ fait
de la mme faon que le navigateur de base.
J'ai
rŽcemment eu ˆ auditer la performance d'une page qui faisait du web 2.0 : un
multi contenu agrŽgeant des flux extŽrieurs et un menu de contenus
configurables. L'utilisation de js et de requtes asynchrone Žtait assez
colossal : sur la mme page on passait de 65 requtes ˆ 115 requtes en
ajoutant ces deux ŽlŽments. La performance s'est bien sžr ŽcroulŽ. On est passŽ
d'une page qui s'affichait en moisn de 3 secondes ˆ une page qui s'affichait en
plus de 7 secondes.
Pourquoi
tant de dŽcalage? A cause des suspects habituels d'abord : trop de javascripts,
insŽrŽs en cÏur de page plut™t que d'appeler leurs fonctions en inline, des requtes
ˆ tire larigot (une par contenu cachŽ), qui chacune Žtait courte, efficace,
mais qui agglomŽrŽes donnaient une performance dŽsastreuse.
J'ai
fait mes recommandations. N'Žtant pas ma”tre du dŽveloppement il m'a fallu composer
avec une Žquipe de dŽveloppement rŽticente ˆ refaire le travail (difficile)
qu'elle avait dŽjˆ fait, mais sans prendre en compte des objectifs de
performance d'affichage.
JÕai
aussi eu des expŽriences dŽsagrŽables avec Dojo : leur systme (malin) de
localisation fait que les fichiers sont en plusieurs bouts. On tŽlŽcharge donc beaucoup de fichiers javascripts. CÕest
un problme en soi. Je conseille donc de se mŽfier de Dojo, voire de faire sa
propre version mono fichier.
Le
sujet de la performance des pages web est un sujet riche, qui se caractŽrise
par l'excellence dans tous les domaines de la crŽation web : excellence
ergonomique, applicative, html et bien sžr http. C'est un travail de
spŽcialiste mŽticuleux et prŽcis, ayant une culture diverse et profonde de la
chose web : cache, https, javascripts font partie de domaines diffŽrents, un
profil rare sinon inexistant. Ce travail est d'autant plus intŽressant qu'il
fait donc intervenir diffŽrentes spŽcialitŽs, et permet de remettre tous les
acteurs de la crŽation de site web autour de la table, ou de la page : vous ne
rŽussirez ˆ mettre de la performance dans vos pages que si vous communiquez
auprs de tous les intervenants et que si vous avez le courage de refaire des
choses qui pourtant marchent 'bien'.
Dans ce
contexte, une approche agile du dŽveloppement de sites et d'applications web
sera prŽfŽrable et vous permettra d'atteindre vos objectifs. Une approche
compartimentŽe est le meilleur moyen de voir les intervenants se renvoyer la
balle et se dŽfausser mutuellement l'un sur l'autre.
C'est
aussi un sujet d'expertise assez rŽcent. Il est donc en Žvolution. Je
vais faire l'effort Žvident de continuer ˆ travailler sur les causes de
lenteurs de sites web, et ˆ analyser le comportement des navigateurs par
rapport ˆ plusieurs comportements. Je mettrai ˆ disposition les mises ˆ jour
des informations disponibles dans ce livre au fur et ˆ mesure.
Les
sites ˆ tester
Top
sites of France Alexa
Vous
pouvez aussi trouver une liste des 30 groupes faisant le plus de trafic
sur Le Journal Du Net
Les
articles de rŽfŽrence
Des
articles sans intŽrt Žcrits par des gens qui ne savent pas de quoi ils parlent
Yahoo Performance
Research
La task force performance de Yahoo
(http://yuiblog.com/blog/2006/11/28/performance-research-part-1/).
Serving Javascript fast Un dŽveloppeur de Flickr (http://www.thinkvitamin.com/features/webapps/serving-javascript-fast)
MnotÕs
web log Mark Nottingham est gourou chez Yahoo,
il a beaucoup travaillŽ chez Akamai, 2 titÕ boites
(http://www.mnot.net/blog/Caching/index.html)
http://www.websiteoptimization.com/ Des
gens qui vendent aussi de lÕoptimisation de site web
http://www.die.net/musings/page_load_time/ Un
ingŽnieur qui travaille sur les applications Web 2.0 dÕune start up : Google.
14 rules for fast web pages Encore
un gars de chez Yahoo. Il faut croire que cette entreprise se pose des
questions sur la performance (http://www.skrenta.com/2007/05/14_rules_for_fast_web_pages_by_1.html).
http://code.google.com/p/minify/ Une
librairie pour Žviter de faire des erreurs avec ses css est ses javascripts en
php.
http://www.webperformance.org/compression/gzip-compress.html pour savoir un peu mieux comment utiliser le mode de compression de Apache, et bien sžr, mod_deflate - Apache HTTP Server (http://httpd.apache.org/docs/2.0/mod/mod_deflate.html)
Yahoo Performance Group un groupe de personnes bien intentionnŽes (http://developer.yahoo.com/performance/).