Développeur enthousiaste : cache Redis sur toute la configuration, latence de la page d'accueil réduite de trente pour cent. Le tunnel de paiement reste à quatre secondes. Personne n'a profilé le tunnel de paiement — le temps vit dans quarante-sept requêtes SQL déclenchées par un accesseur Laravel mal nommé. Redis a accéléré ce qui était déjà rapide.
Profiler PHP, ce n'est pas une étape « quand on a le temps ». C'est l'anti-débat entre intuition et mesure. Sans graphique en flammes, vous réécrivez du code ; avec, vous attaquez les cinq pour cent du graphe d'appels qui coûtent quatre-vingts pour cent du temps.
Outils par contexte
| Outil | Environnement | Surcharge |
|---|---|---|
| Blackfire / Tideways | Préproduction + production en échantillonnage | Faible |
| SPX | Développement/préproduction, production possible | Très faible |
| Trace Xdebug | Développement/préproduction uniquement | Élevée |
| Journal PHP-FPM slowlog | Production | Minimale |
| Supervision APM (Datadog, Sentry) | Production | Variable |
Workflow recommandé :
- La supervision identifie la route lente au percentile 95.
- Blackfire ou SPX profile cette URL sous charge simulée.
- Correction (SQL, cache, algorithme).
- Re-profile — preuve chiffrée du gain.
Ne profilez pas la page d'accueil si le ticket mentionne « export CSV admin en timeout ».
Lire les résultats sans se perdre
Signaux fréquents :
| Fonction dominante | Action |
|---|---|
PDOStatement->execute | EXPLAIN, index, chargement anticipé ORM |
curl_exec | Délai d'attente, cache, traitement asynchrone |
file_get_contents | Entrées-sorties locales, flux, stockage objet |
unserialize / json_decode volumineux | Format de charge utile, cache |
preg_match massif | Refactorisation regex ou parsing |
Intégration en intégration continue et préproduction
- Comparaisons Blackfire sur les pull requests si le budget le permet.
- Seuil de régression : plus dix pour cent de temps mur bloque la fusion (routes critiques).
- Jeu de données anonymisé proche de la production obligatoire — profiler sur trois lignes en base ment.
Le profileur révèle parfois des limites d'infrastructure : entrées-sorties disque sur les fichiers de session → sessions Redis ; résolution DNS lente → résolveur fixe ; OPcache désactivé → activation immédiate. Monter en gamme de VPS avant de profiler reste un gaspillage fréquent.
Avant d'ouvrir un ticket « instance trop petite », profilez la route lente identifiée par la supervision. Croisez avec Invalidation OPcache si le déploiement récent pourrait servir un mélange d'anciennes et nouvelles versions du code.
Le sommet : optimiser sans profiler, c'est refactoriser pour le plaisir
Voici ce que les vendredis soirs « j'ai optimisé une ligne » oublient de montrer.
Règle d'équipe : ticket performance clos avec capture avant/après — lien Blackfire ou export SPX.
Décider et avancer sans angle mort
Sur une demi-journée, vous pouvez instaurer une discipline de mesure :
- Identifiez la route cible via supervision APM ou journal slowlog.
- Profilez en préproduction sous charge réaliste.
- Corrigez uniquement le sommet du graphique en flammes.
- Re-mesurez le percentile 95 en production.
- Documentez la leçon — requêtes N+1 classiques ?
Commencez par la route que les utilisateurs attendent réellement — pas celle que vous regardez le plus souvent en développement. Croisez Saturation PHP-FPM, Index MySQL manquant et EXPLAIN PostgreSQL selon votre moteur de base.
Questions fréquentes
Quel outil profiler en production ?
SPX ou échantillonnage léger Blackfire/Tideways. Jamais Xdebug en mode pas à pas en production. Le journal des requêtes lentes PHP-FPM suffit pour repérer les entrées-sorties longues sans surcharge complète.
Xdebug profiler en staging suffit-il ?
Oui si les données et le trafic sont proches de la production. Profilez les routes lentes identifiées par la supervision — pas seulement la page d'accueil qui masque les vrais goulets.
Comment lire un flame graph ?
La largeur représente le temps cumulé. Cherchez les barres larges inattendues — PDO, curl, unserialize. Optimisez la plus large en premier, selon la loi de Pareto.
Le profileur indique PDO lent — que faire ?
Lancez EXPLAIN sur la requête SQL, vérifiez les index et les requêtes N+1 de l'ORM. Le profileur indique où le temps est passé ; EXPLAIN explique pourquoi la base répond lentement.
Mesurer une ligne PHP coûte moins cher que la réécrire deux fois — profiler d'abord, ego ensuite.