Débusquer un bug silencieux d'Imagick pour vraiment compresser en AVIF
Cas interne, déshumanisé : un paramètre de qualité ignoré sans erreur ni avertissement, sur notre propre pipeline de traitement d'images.
Contexte & enjeux
L'AVIF permet un gain de poids important par rapport au JPEG ou au WebP à qualité équivalente, mais ce gain dépend entièrement du bon réglage de la compression au moment de la génération. Notre pipeline d'upload et de traitement d'images en PHP s'appuyait sur l'API objet Imagick pour convertir les images vers ce format, y compris en passant explicitement un paramètre de qualité.
Problème rencontré
Les images générées étaient bien au format AVIF, mais leur poids restait anormalement proche du fichier source — symptôme d'une compression qui ne s'appliquait pas réellement. En creusant, le paramètre de qualité transmis via l'API PHP Imagick était silencieusement ignoré par l'encodeur AVIF sur la version d'ImageMagick installée en production, sans erreur ni avertissement renvoyé par PHP. Le pire type de bug : invisible côté code, sans exception à intercepter, détectable uniquement en comparant le poids réel des fichiers générés.
Objectifs
- Obtenir une compression AVIF effective et mesurable.
- Ne plus dépendre d'un comportement non documenté de l'extension PHP.
- Conserver le reste du pipeline inchangé (redimensionnement, nommage versionné compatible avec le cache immuable du CDN).
Solution technique mise en place
Contournement du bug en confiant l'encodage au binaire `convert` d'ImageMagick appelé en ligne de commande depuis PHP (`convert source -quality XX destination.avif`), qui respecte correctement le paramètre de qualité contrairement à l'API objet PHP. Le reste du pipeline — redimensionnement, nommage versionné des fichiers pour rester compatible avec un cache CDN configuré en immuable — reste inchangé.
Qualité et vérification
- Comparaison systématique du poids de fichier avant/après génération, plutôt que de faire confiance à la seule absence d'erreur.
- Bascule progressive validée sur un échantillon avant généralisation à l'ensemble du pipeline.
Les résultats
Indicateur
Poids moyen d'une image AVIF générée
Détection du bug
Méthode de génération
Fiabilité du réglage de qualité
Avant
quasi identique au fichier source
aucune alerte, comportement silencieux
API objet PHP Imagick
dépendante d'un comportement non documenté
Après
réduction nette après correctif
comparaison de poids systématique après génération
appel en ligne de commande `convert -quality`
vérifiée et reproductible
Services & expertises mobilisés
- Audit de pipeline de traitement et de compression d'images.
- Diagnostic de bugs silencieux dans une extension PHP tierce (pas d'exception, pas de log).
- Mise en place d'une génération AVIF fiable et mesurable.
- Compatibilité avec un cache CDN immuable (nommage versionné des assets).

