#20339 - Note : optimisation PHP
Mon site est régulièrement sujet à des ralentissements. C’est pas nouveau mais c’est un peu chiant.
Je ne sais toujours pas si ça vient de moi (mon site) ou un autre, car je suis en mutualisé. J’essaie tout de même d’optimiser un peu.
Une des pages les plus vue de mon site, c’est la page du Gravatar local.
Dans les commentaires, plutôt que votre navigateur accède à Gravatar (service externe), il demande à mon serveur d’aller chercher sur Gravatar. Ensuite, le serveur stocke l’image récupérée pour la prochaine fois.
À chaque fois que les commentaires s’affichent, une requête est faite sur le fichier /favatar.php, avec en paramètres le hash de l’image à récupérer.
C’est bien un script PHP qui est lancée à chaque fois. Si le fichier du hash existe sur le serveur, il le read() et l’envoi. Sinon, il le récupère, le sauvegarde et l’envoie.
Je viens de trouver une autre méthode.
Plutôt que de faire une requête sur le fichier /favatar.php, je fais une requête sur l’image directement : /cache/gravatar/hash.png.
Là, si le fichier existe, le serveur l’envoie et ça s’arrête là. Pas de PHP à lancer.
Si le fichier n’existe pas, en revanche, ça devrait envoyer un 404. Sauf que j’utilise un .htaccess pour rediriger sur le /favatar.php et récupérer l’image.
C’est bien mieux : dans la grande majorité des cas, la requêtes est désormais une simple image sur le disque, plus un fichier PHP à lancer, qui va regarder si le fichier existe, qui va le lire, et l’envoyer au navigateur.
J’aurais dû faire ça depuis le début, je sais, je sais, mais on va voir si ça aide.
~
Pour mettre ça en place, faire directement la requête sur /dossier/fichier.png
Dans /dossier/, mettre un .htaccess avec le code suivant :
# If requested resource doesn't exists as a file redirects to the PHP script
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) relative/path/to/script.php?q=$1 [L]
La première ligne est la condition nécessaire à l’application de la seconde. Elle teste « le fichier demandé n’est pas un fichier sur le disque (!-f) ». Si le fichier est absent, il renvoie "true" et exécute la ligne suivante, à savoir une réécriture (pas redirection) vers script.php, avec comme paramètre "q", le $1 qui contient le nom du fichier demandé (on peut y rajouter d’autres paramètres si besoin :
RewriteRule (.*) relative/path/to/script.php?s=search&format=png&q=$1 [L]
[/code]
Ensuite dans script.php, on fait ce qu’on a à faire avec les paramètres (wget sur le fichier, imagemagic pour créer une image, etc., puis on read() le fichier, pour éviter une redirection et une autre requête :
// send file to browser
header('Content-Type: image/png');
header('Last-Modified: '.gmdate('D, d M Y H:i:s', filemtime($target_file)).' GMT');
header('Content-Length: ' . filesize($target_file));
header('Cache-Control: public, max-age=2628000');
readfile($target_file);
exit;
~
Sinon, en aparté : j’ai modifié le thème pour https://couleur-science.eu/ . Le thème est désormais clair ou sombre en fonction du paramétrage de votre navigateur.