Une application lente engendre des coûts souvent insoupçonnés. Les visiteurs quittent les pages trop longues à charger, les employés s'impatientent face à des tableaux de bord lents, les moteurs de recherche privilégient les sites rapides et les serveurs surchargés font grimper les factures d'hébergement. Laravel est un framework performant capable de créer des applications très rapides, mais il ne garantit pas automatiquement la rapidité de toutes les applications. La vitesse est le fruit de choix judicieux, et quelques erreurs courantes sont à l'origine de la plupart des ralentissements. Ce guide présente quatorze méthodes pratiques pour améliorer les performances de Laravel, dans l'ordre généralement le plus efficace : mesurer d'abord, optimiser la base de données, puis ajouter la mise en cache et le traitement en arrière-plan, et enfin optimiser le framework et l'infrastructure. Destiné aux développeurs et à leurs responsables, chaque section explique l'importance de chaque point et propose des solutions concrètes. Si vous n'êtes pas certain que votre application présente des problèmes plus profonds, notre article sur les signes indiquant que votre application Laravel a besoin d'une analyse technique (blog/laravel-application-technical-review-signs) vous sera utile, et notre page sur le développement Laravel (laravel-development.php) explique notre approche.
Étape zéro : mesurer avant toute modification
L'erreur de performance la plus courante consiste à optimiser le mauvais élément. Procéder par tâtonnements est une perte de temps et complexifie inutilement le système. Avant de modifier le code, identifiez précisément où le temps est consacré.
1. Identifiez les pages et les requêtes lentes
Outils utiles :
- Laravel Debugbar en développement, qui affiche les requêtes, les temps d'exécution et la mémoire utilisée pour chaque page.
- Laravel Telescope, pour inspecter les requêtes, les tâches et les exceptions en développement et en préproduction.
- Le journal des requêtes lentes de la base de données, qui enregistre les requêtes sur une période donnée.
- Les services de surveillance des performances de l'application en production, qui affichent l'expérience utilisateur réelle.
- Les outils de développement du navigateur, pour distinguer le temps serveur du temps de chargement côté client.
Commencez par les pages qui suscitent le plus de plaintes des utilisateurs, ou celles qui génèrent le plus de trafic. Notez le temps de réponse, le nombre de requêtes et la mémoire utilisée. Ces données serviront de référence pour déterminer l'efficacité d'une modification.
Le résultat est souvent surprenant. Une page lente à cause d'une image volumineuse ou d'un code JavaScript lourd ne bénéficiera pas d'une optimisation de la base de données, et une page avec une centaine de requêtes ne sera pas améliorée par un serveur plus rapide.
La base de données : là où se situent la plupart des problèmes
Dans les applications métier classiques, la lenteur provient majoritairement de la base de données, et généralement de quelques schémas récurrents.
2. Résoudre le problème des N+1 requêtes
Il s'agit du problème de performance le plus courant avec Laravel. Il survient lorsque le code charge une liste d'enregistrements, puis exécute une requête supplémentaire pour chacun d'eux afin de récupérer les données associées. Afficher 100 commandes avec leurs clients peut ainsi générer 101 requêtes sans que cela se produise.
Pour y remédier, chargez les données associées à l'avance avec with(), afin que Laravel récupère toutes les données en quelques requêtes au lieu de centaines. Vous pouvez également configurer Laravel pour qu'il génère une erreur lors du développement à chaque chargement différé, ce qui permet de détecter le problème avant qu'il n'atteigne les utilisateurs.
3. Ajoutez les index appropriés
Sans index, la base de données lit chaque ligne pour trouver l'information demandée. Sur une petite table, cela passe inaperçu ; sur une grande, c'est extrêmement lent. Ajoutez des index aux colonnes que vous utilisez fréquemment pour filtrer, trier ou effectuer des jointures, telles que les clés étrangères, les champs de statut et les dates.
Utilisez les outils d'analyse de requêtes de la base de données, par exemple EXPLAIN, pour vérifier qu'une requête utilise bien un index. N'indexez pas tout : chaque index ralentit les écritures et consomme de l'espace de stockage. Ajoutez-les donc uniquement lorsque c'est nécessaire.
4. Sélectionnez uniquement les données nécessaires
Charger des enregistrements complets avec toutes les colonnes, y compris les grands champs de texte, alors que vous n'avez besoin que d'un nom et d'une adresse e-mail, gaspille de la mémoire et du temps. Sélectionnez les colonnes spécifiques. Pour les grands ensembles de résultats, traitez les données par blocs ou utilisez des collections paresseuses afin que l'application n'ait pas à charger des centaines de milliers d'enregistrements en mémoire simultanément.
5. Pagination et limitation
Ne chargez jamais une liste illimitée. Utilisez la pagination pour les listes affichées aux utilisateurs et des limites pour tout le reste. Envisagez une pagination simple, qui évite un calcul de total coûteux, pour les très grandes tables.
6. Déportez les opérations vers la base de données
Le tri, le filtrage, le regroupement et la somme sont des opérations que les bases de données effectuent avec une grande efficacité. Les réaliser en PHP après le chargement de tous les enregistrements est généralement beaucoup plus lent. Utilisez des requêtes, des agrégats et, le cas échéant, des vues de base de données ou des tables récapitulatives pour les rapports volumineux.
Mise en cache : effectuez le travail une seule fois
7. Mettez en cache les résultats coûteux
Si une requête ou un calcul est coûteux et que sa réponse ne change pas à chaque requête, comme le total d'un tableau de bord, une liste de produits ou une recherche de configuration, stockez le résultat dans un cache pendant une courte période au lieu de le recalculer à chaque fois.
- Utilisez un pilote de cache rapide tel que Redis en production plutôt que le pilote de fichiers.
- Choisissez des durées d'expiration appropriées et invalidez le cache lorsque les données sous-jacentes changent.
- Gérez le cache avec précaution. Des données obsolètes peuvent être pires que des données lentes lorsque la précision est importante, par exemple pour les niveaux de stock ou les soldes.
8. Utilisez la mise en cache HTTP et de pages lorsque cela est approprié
Les pages publiques qui changent rarement peuvent être mises en cache sur le serveur Web ou un réseau de diffusion de contenu (CDN), de sorte que la plupart des visiteurs n'accèdent jamais à PHP. Configurez correctement les en-têtes de cache pour les ressources statiques afin que les navigateurs réutilisent les fichiers au lieu de les télécharger à nouveau.
Ne faites pas attendre les utilisateurs
9. Déplacez les tâches lentes vers des files d'attente
Toute tâche qui prend plus d'un instant et qui n'a pas besoin d'être terminée avant que l'utilisateur ne voie une réponse doit être exécutée en arrière-plan : envoi d'e-mails et de notifications, génération de PDF et de rapports, traitement d'images et de fichiers, appels à des services tiers lents et synchronisation avec d'autres systèmes.
Le système de files d'attente de Laravel simplifie cette opération. L'utilisateur reçoit une réponse immédiate et les processus gèrent la tâche en arrière-plan, avec des tentatives de nouvelle exécution en cas d'échec. Utilisez Redis ou un système de gestion de files d'attente fiable et surveillez les files d'attente afin qu'aucune erreur ne passe inaperçue. Laravel Horizon propose un tableau de bord pour les files d'attente Redis.
10. Planifiez les tâches lourdes en dehors des heures de pointe
Les rapports, le nettoyage, les importations et les synchronisations peuvent s'exécuter pendant les périodes creuses grâce au planificateur de Laravel, au lieu de concurrencer les utilisateurs aux heures de pointe.
Le framework et le serveur
11. Utilisez les commandes d'optimisation intégrées de Laravel en production
Laravel peut mettre en cache plusieurs éléments afin de réduire le travail effectué sur chaque requête.
- Cache de configuration (
php artisan config:cache) combine la configuration dans un seul fichier. - Cache de routes (
php artisan route:cache) accélère l'enregistrement des routes. - Cache de vues (
php artisan view:cache) précompile les modèles. - Cache d'événements précalcule la découverte des événements.
php artisan optimizeexécute les principales étapes de mise en cache simultanément.
Exécutez ces commandes comme Faites partie de votre déploiement et n'oubliez pas de les effacer ou de les reconstruire lorsque la configuration change. Installez également les dépendances de production avec un chargeur automatique optimisé (composer install --optimize-autoloader --no-dev).
12. Optimisation de PHP et du serveur
Les paramètres d'infrastructure de base font toute la différence.
- Utilisez une version PHP récente. Chaque mise à jour apporte des améliorations de performances.
- Activez OPcache, qui stocke le code PHP compilé en mémoire. C'est l'un des gains les plus faciles à obtenir.
- Dimensionnez les workers PHP et la mémoire en fonction de votre trafic et de votre serveur.
- Utilisez un serveur de base de données rapide avec suffisamment de mémoire et configurez-le judicieusement.
- Placez la base de données à proximité de l'application pour réduire la latence réseau.
- Pensez à utiliser Laravel Octane, qui maintient l'application en mémoire entre les requêtes grâce à Swoole ou RoadRunner. Cela peut augmenter considérablement le débit pour les applications compatibles, mais nécessite une attention particulière à l'état persistant entre les requêtes ; ce n'est donc pas un choix par défaut.
13. Optimiser le front-end et les ressources
La vitesse du serveur ne représente qu'une partie de l'expérience utilisateur.
- Compressez et redimensionnez les images et utilisez des formats modernes tels que WebP.
- Minifiez et regroupez les fichiers CSS et JavaScript avec votre outil de compilation, et ne chargez que ce dont chaque page a besoin.
- Différez l'exécution des scripts non critiques et chargez les images en différé (en dessous de la ligne de flottaison).
- Différez la diffusion des ressources via un CDN proche de vos utilisateurs.
- Évitez les scripts tiers lourds qui ralentissent l'affichage.
- Activez la compression telle que gzip ou Brotli sur le serveur.
L'optimisation du front-end est souvent le moyen le plus rapide d'améliorer la sensation de vitesse d'une page, et elle influe également sur le référencement.
14. Maintenez un code léger et limitez les dépendances.
- Supprimez Packages inutilisés. Chacun ajoute de la charge et de la maintenance.
- Évitez d'effectuer des tâches lourdes dans les fournisseurs de services, les intergiciels ou les portées globales qui s'exécutent à chaque requête.
- Soyez prudent avec les grandes collections en mémoire ; utilisez des opérations de base de données ou des collections paresseuses.
- Effectuez régulièrement un profilage. Les performances diminuent à mesure que des fonctionnalités sont ajoutées, il est donc important de les vérifier dans le cadre du développement continu, et pas seulement lorsque les utilisateurs se plaignent.
Tableau de référence rapide
| Symptôme | Cause probable | Première chose à essayer |
|---|---|---|
| La page effectue des centaines de requêtes | Problème N+1 | Chargement anticipé avec with() |
| Une requête prend quelques secondes | Index manquant ou requête lourde | EXPLAIN, ajouter un index, réécrire la requête |
| Le tableau de bord est lent | Calculs répétitifs coûteux | Mettre les résultats en cache ou utiliser des tableaux récapitulatifs |
| La soumission du formulaire se bloque | Traitement lent dans la requête | Déplacer vers une tâche en file d'attente |
| Chaque requête est légèrement lente | Surcharge du framework | Cache de configuration, de routage et de vues, OPcache |
| Erreurs de mémoire sur les grandes listes | Chargement trop important en une seule fois | Segmentation, collections paresseuses, pagination |
| Serveur rapide, page lente | Front-end lourd | Compression des images, réduction des scripts, utilisation d'un CDN |
| Ralentissements lors des pics de trafic | Trop peu de workers, pas de cache | Cache, plus de workers, envisager Octane |
Erreurs courantes
- Optimisation sans mesure. Vous risquez de corriger le mauvais problème.
- Tout mettre en cache. Des données obsolètes ou incohérentes provoquent des bogues difficiles à tracer.
- Ajout d'index à l'aveugle., ce qui ralentit les écritures sans améliorer les lectures.
- Ignorer le problème N+1., car il est invisible avec de petits ensembles de données de test.
- Tests uniquement avec de très petits ensembles de données., les problèmes de performance apparaissent à une échelle réelle.
- Exécution en production avec le mode débogage ou les paramètres de développement.
- Utilisation du cache de fichiers et de la file d'attente de synchronisation en production.
- Considérer l'optimisation des performances comme un projet ponctuel plutôt que comme une habitude.
- Négliger l'interface utilisateur.
- Mettre à l'échelle le matériel avant de corriger le code. Un serveur plus puissant masque un problème à un coût plus élevé.
Performances et contexte global
La vitesse n'est pas qu'une question technique. Elle influe sur la conversion, la visibilité dans les moteurs de recherche, les coûts d'hébergement et la productivité du personnel. Elle est également liée à la maintenabilité : un code propre, testé et doté d'une structure logique est plus facile à optimiser en toute sécurité. C’est pourquoi nous encourageons les investissements précoces dans la qualité, comme décrit dans Coûts de maintenance logicielle, et le choix de la technologie adaptée, sujet abordé dans Laravel vs Node.js.
Si vous prévoyez une application de grande envergure, la performance doit être intégrée à la conception dès le départ : il faut tenir compte du volume de données, du trafic attendu et des éléments pouvant être mis en cache ou en file d’attente. Nos Guide des coûts des applications web et Guide des coûts Laravel montrent comment les besoins en termes d’évolutivité et de performance influencent les budgets.
Une routine de performance simple
- Définissez un objectif, par exemple, des pages chargées en moins de deux secondes pour la plupart des utilisateurs.
- Mesurez les pages clés et enregistrez la performance de référence.
- Commencez par résoudre le problème le plus important, généralement un problème de base de données.
- Mesurez à nouveau pour confirmer l'amélioration.
- Ajoutez de la mise en cache et des files d'attente là où elles permettent d'éliminer les tâches répétitives ou lentes.
- Appliquez des optimisations de production lors de votre processus de déploiement.
- Surveillez en continu et effectuez un bilan après chaque mise à jour majeure.
Conclusion
La plupart des problèmes de performance de Laravel proviennent d'une liste restreinte de causes : trop de requêtes, des index manquants, des tâches lentes effectuées pendant que l'utilisateur attend et des optimisations de production manquantes. Mesurez et corrigez d'abord la base de données, mettez en cache et en file d'attente ce que vous pouvez, optimisez le framework et le serveur, et veillez à la légèreté du front-end. De petites modifications bien choisies permettent généralement d'accélérer considérablement les applications sans les réécrire.
Si votre application est lente et que vous ne savez pas pourquoi, contactez-nous. Nous pouvons l'examiner, trouver les véritables goulots d'étranglement et proposer un plan priorisé, ou, si vous avez besoin de main-d'œuvre supplémentaire de façon continue, vous pouvez embaucher des développeurs Laravel pour travailler aux côtés de votre équipe.