De temps en Google me donne sur mon panneau de contrôle AdSense divers conseils pour optimiser les performances de mes sites. Je me suis décidé à en prendre un en compte : l’optimisation du poids des images. Mais comme je suis du genre un peu flemmard, pas question d’optimiser manuellement chaque image avant de l’ajouter au site. J’ai donc écrit un petit script pour le faire.
Ce script est à priori utilisable sur à peu près tous les serveurs dédiés ou virtuels sous Linux, pour peu qu’OptiPNG et jpegoptim y soient installés.
Si vous utilisez Ubuntu sur votre serveur (marche peut-être aussi avec une Debian ou autre distribution dérivée de Debian), l’installation peut se faire aisément via apt-get :
1 |
user@host:~# sudo apt-get install jpegoptim optipng |
Ensuite, ce script va permettre d’automatiser le traitement :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
#!/bin/bash BASE_FILE=$(cd ${0%/*} && echo $PWD/${0##*/}) BASE_FOLDER=`dirname ${BASE_FILE}` # Chemin des sites à partir du home de l'utilisateur SITES="www/monsiteamoiquejai.fr www/monautresite.com" MTIME=7 COMPR=7 function traiterSite() { echo "...Optimisation des images JPEG" for IMAGE in `find $1 -mtime -${MTIME} -type f -name *.jp* | grep "jpg$\|jpeg$\|jpe$"`; do if [ `date -r ${IMAGE} +%s` -gt ${LASTRUN} ]; then echo "......${IMAGE}" jpegoptim -p --strip-all "${IMAGE}" > /dev/null fi done echo "...Optimisation des images PNG" for IMAGE in `find $1 -mtime -${MTIME} -type f -name *.png`; do if [ `date -r ${IMAGE} +%s` -gt ${LASTRUN} ]; then echo "......${IMAGE}" optipng -o ${COMPR} "${IMAGE}" > /dev/null fi done } function run() { echo "************************************************" echo "* Debut de l'optimisation : `date +"%Y-%m-%d %H:%M:%S"` *" echo "************************************************" LASTRUN=0 if [ -f ${BASE_FOLDER}/.optimg_run ]; then LASTRUN=`cat ${BASE_FOLDER}/.optimg_run` fi for SITE in ${SITES}; do echo "Traitement du site ${SITE}" traiterSite /home/${USER}/${SITE} echo "...OK" done echo "**********************************************" echo "* Fin de l'optimisation : `date +"%Y-%m-%d %H:%M:%S"` *" echo "**********************************************" date +%s > ${BASE_FOLDER}/.optimg_run } run 2>&1 | tee -a ${BASE_FOLDER}/optimg_`date +%s`.log |
Avant d’exécuter le script, insérez la liste des répertoires à traiter dans la variable SITES à la ligne 5. Vous pouvez également modifier la variable MTIME pour traiter des fichiers plus anciens, notamment pour la première exécution, et la variable COMPR pour modifier le niveau de compression d’OptiPNG (de 0 à 7).
Le script ira alors chercher toutes les images JPEG et PNG datant de moins de MTIME jours dans ces répertoires puis leur appliquera l’optimisation. En plus du filtre sur les fichiers datant de moins de MTIME jours, le script conserve sa date de dernière exécution dans le fichier .optimg_run, pour ne traiter que les fichiers postérieures à cette exécution. Pensez à supprimer ce fichier si vous ajoutez de nouveaux dossiers à la liste.
Le traitement des fichiers JPEG est très rapide, mais on ne peut pas en dire autant pour les PNG… Si vous en avez beaucoup, je vous recommande de réduire le niveau de compression sur la passe initiale.
Une fois le script paramétré, il n’y a plus qu’à l’ajouter à la crontab pour une exécution programmée (avec une fréquence d’exécution en accord avec la valeur de MTIME) :
1 |
user@host:~# crontab -e |
Par exemple, pour une exécution hebdomadaire le dimanche à 4h du matin, ajoutez la ligne suivante dans la crontab :
1 |
0 4 * * 7 /home/user/optimg.sh |
Et voilà, si tout se passe bien vos images devraient automatiquement être optimisées sans que vous ayez à vous en préoccuper 🙂
marche pas avec des noms de fichiers qui contiennent des espaces
J’ai corrigé le script, ça devrait aller mieux maintenant.
Bonjour,
Merci pour votre script. Il fonctionne bien encore, même s’il est un peu ancien. Mais de mon côté, les PNG sont bien optimés mais les JPG ne bougent pas. Pourtant, ils sont bien détectés et optimisables. Ca vous dit quelque chose ?
J’ai pu adapter la compression avec -m75 pour diminuer la qualité et ça fonctionne (peut aller de 0 à 100). Merci 🙂