Ceci est un résumé après. Après avoir traversé de nombreux pièges dans le processus de réglage, nous avons finalement perfectionné et mis en œuvre un plan préliminaire de tests de performances et résumé certaines compétences pratiques dans le processus de développement de Laravel à travers des données de test réelles.
Récemment, un collègue a signalé que la réponse de l'application écrite en Laravel est un peu lente et que plus de 20 concurrences épuisent le CPU... Afin de résoudre le problème de la lenteur, certaines interfaces sont même utilisées nodejs Venez écrire.
Et ma première réaction a été : comment un framework populaire peut-il être si mauvais ? Il doit y avoir un problème avec l'utilisation. Afin de le savoir, j'ai commencé ce parcours de réglage des performances des applications Laravel.
Les techniques d'optimisation utilisées dans ce plan de test de performances sont principalement basées sur le framework Laravel lui-même et les outils qu'il fournit.
Désactiver le débogage des applications app.debug=false
Informations de configuration du cachephp artisan config:cache
Cache Informations de routagephp artisan router:cache
Optimisation du chargement de la carte de classephp artisan optimize
Optimisation du chargement automatiquecomposer dumpautoload
Chargez uniquement le middleware nécessaire si nécessaire
Utilisez un compilateur juste à temps (JIT), tel que : HHVM, OPcache
Utiliser PHP 7.x
En plus des techniques d'optimisation ci-dessus, il existe de nombreuses pratiques de codage qui peuvent améliorer les performances des applications Laravel, qui ne seront pas expliquées dans cet article pour le moment . (Vous pouvez également suivre mes articles de suivi)
Ouvrez le fichier .env dans le répertoire racine de l'application et définissez le débogage sur false.
APP_DEBUG=false
php artisan config:cache
L'exécution de la commande ci-dessus peut fusionner toutes les informations de configuration du dossier de configuration en un seul bootstrap/cache/config.php
fichier, réduisant ainsi le nombre de fichiers à être chargé pendant l'exécution.
php artisan config:clear
Exécutez la commande ci-dessus pour vider le cache des informations de configuration, c'est-à-dire supprimer le bootstrap/cache/config.php
fichier
php artisan route:cache
bootstrap/cache/routes.php
L'exécution de la commande ci-dessus effacera le cache de routage, ce qui signifie supprimer le fichier
php artisan route:clear
4. Optimisation du chargement du mappage de classes bootstrap/cache/routes.php
php artisan optimize --force
bootstrap/cache/compiled.php
Les classes à fusionner peuvent être ajoutées en modifiant le fichier bootstrap/cache/services.json
.
Dans un environnement de production, il n'est pas nécessaire de spécifier config/compile.php
les fichiers de paramètres et ils peuvent être générés automatiquement.
--force
L'exécution de la commande ci-dessus effacera l'optimisation du chargement de la carte de classe, c'est-à-dire supprimera les fichiers
php artisan clear-compiled
bootstrap/cache/compiled.php
5. Optimisation du chargement automatique bootstrap/cache/services.json
composer dumpautoload -o
Remarque : Cette opération a déjà été effectuée dans la commande
.L'application Laravel intègre et active de nombreux middlewares. Chaque requête Laravel charge le middleware associé et génère diverses données. Commenter les middlewares inutiles (tels que la prise en charge de session) dans
php artisan optimize --force
6. Chargez uniquement le middleware nécessaire selon vos besoins
7. Utilisez des compilateurs juste à temps app/Http/Kernel.php
Eh bien, limité à votre environnement d'entreprise réel, cela pourrait ne pas changer avant longtemps, donc je n'en ai pas parlé.
Nous utilisons la simple commande Apache ab pour tester uniquement le fichier d'entrée de l'application, et enregistrer et analyser les données. Testez uniquement le fichier d'entrée de l'application index.php, et accédez à « / » ou « /index.php » pour revenir à la page d'accueil du cadre. Des tests de performances plus complets nécessitent de tester davantage d'interfaces de l'application.Plan de test 0x02
ab -t 10 -c 10 {url}
Chaque fois que les conditions de test sont ajustées, vous devez accéder à la page d'accueil du navigateur pour vous assurer qu'il n'y a pas d'erreurs d'accès dues à la modification des conditions de test. Si des erreurs d'accès à la page se produisent, les résultats du test seront incorrects.
Description de l'environnement du serveur
Toutes les données de test séparées de l'environnement spécifique n'ont aucun sens et ne peuvent être comparées que dans des conditions similaires.
Cet environnement fonctionne sur un Mac doté de 8 Go de mémoire, d'un processeur de 2,8 GHz et d'un disque dur SSD.
Le serveur de test est construit à l'aide de Homestead. La machine virtuelle est configurée avec un processeur monocœur et une mémoire 2G.
La version PHP du serveur est 7.1. Si elle n'est pas spécifiée, OPcache est activé.
L'application Laravel testée a été écrite en version 5.2. 85 itinéraires sont définis en appHttproutes.php
.
Pendant le processus de test, à l'exception de la machine virtuelle, du terminal et de la fenêtre de navigateur fixe, aucun programme n'a été détecté qui pourrait affecter le fonctionnement de la machine.
Vous pouvez vous référer aux données ci-dessus lorsque vous effectuez vos propres tests.
Effectuer les éléments de contrôle correspondants en fonction à l'opération suivante.
Exécuter ab -t 10 -c 10 http://myurl.com/index.php
Éléments de vérification de base
. le fichier env APP_DEBUG=true
n'existe pasbootstrap/cache/config.php
n'existe pasbootstrap/cache/routes.php
N'existe pasbootstrap/cache/compiled.php
et bootstrap/cache/services.json
app/Http/Kernel.php
permettent à la plupart des middlewares
du navigateur d'accéder à Laravel. La page d'accueil de l'application garantit un accès normal
Modifier APP_DEBUG=false
dans le fichier .env en fonction de l'étape 1.
Visitez la page d'accueil de l'application Laravel avec votre navigateur pour garantir un accès normal.
Exécutez ab -t 10 -c 10 http://myurl.com/index.php
.
Comparaison avec les résultats de l'étape 1 Découverte : après avoir désactivé le débogage de l'application, le nombre de requêtes traitées par seconde est passé de 26-34 à 33-35, et le temps de réponse des requêtes est passé de plus de 300 ms à environ 290 ms. L'effet n'est pas évident, mais. il y a effectivement une certaine amélioration.
Remarque : Cette partie est étroitement liée à l'utilisation des journaux dans l'application.3. Activer les informations de configuration du cache3.1 Opération
et confirmez la générationphp artisan config:cache
. bootstrap/cache/config.php
. ab -t 10 -c 10 http://myurl.com/index.php
3.3 Résultats de la comparaisonComparaison avec les résultats de l'étape 2 Découverte : après avoir activé le cache des informations de configuration, le nombre de requêtes traitées par seconde est passé de 33-35 à 36-38 et le temps de réponse des requêtes est passé d'environ 290 ms à environ 260 ms.
L'effet n'est pas évident, mais. il y a effectivement une certaine amélioration.
4. Activer les informations de routage du cache4.1 Opération et confirmez la générationphp artisan route:cache
. bootstrap/cache/routes.php
. ab -t 10 -c 10 http://myurl.com/index.php
4.3 Résultats de la comparaisonComparer avec les résultats de l'étape 3 Résultats : Après avoir activé le cache des informations de routage, le nombre de requêtes traitées par seconde est passé de 36-38 à environ 60, et le temps de réponse des requêtes est passé de 260 ms à environ 160 ms. L'effet était significatif du point de vue de. TPS, il a augmenté de 70%.
5. Supprimer le middleware inutile
Remarque : j'ai commenté tous les middlewares dans ce test. Dans les situations réelles, vous devriez essayer de conserver uniquement les middlewares nécessaires.
Comparer avec les résultats de l'étape 4 et find: Supprimer Après la suppression des middlewares inutiles, le nombre de requêtes traitées par seconde est passé d'environ 60 à environ 90 et le temps de réponse des requêtes est passé de 160 ms à environ 110 ms L'effet est très évident du point de vue de TPS. il a augmenté de 50 %.
Sur la base de l'étape 5, exécutez php artisan optimize --force
et confirmez la générationbootstrap/cache/compiled.php
et bootstrap/cache/services.json
.
Visitez la page d'accueil de l'application Laravel avec votre navigateur pour garantir un accès normal.
Exécutez ab -t 10 -c 10 http://myurl.com/index.php
.
Comparaison avec les résultats de étape 5 Découverte : Après l'optimisation du chargement du mappage de classes, le nombre de requêtes traitées par seconde est passé de 90 à 110 et le temps de réponse des requêtes est passé de 110 ms à moins de 100 ms L'effet est assez évident.
Sur la base de l'étape 6, fermez OPcache de PHP et redémarrez le serveur. Confirmez que OPcache est fermé via Zend OPcache de phpinfo().
Visitez la page d'accueil de l'application Laravel avec votre navigateur pour garantir un accès normal.
Exécutez ab -t 10 -c 10 http://myurl.com/index.php
.
Comparer avec les résultats de étape 6 Découverte : après avoir désactivé OPcache, le nombre de requêtes traitées par seconde est passé de 110 à 15 et le temps de réponse aux requêtes est passé de moins de 100 ms à plus de 650 ms. La différence de données est plusieurs fois plus grande lorsque OPcache est activé ou désactivé.
Après cela, j'ai rouvert l'OPcache de PHP et les données ont été restaurées au niveau de l'étape 6.
Exécution de la commande php artisan route:cache
Signaler cette erreur. .
Cause : La fermeture est utilisée lors du traitement de "/" dans le fichier de routage. Pour exécuter cette commande, l'implémentation du routage ne doit pas utiliser de fermetures.
Plan de modification : Mettez l'implémentation spécifique du routage dans le contrôleur.
Cette erreur est signalée lors de l'exécution de la commande php artisan route:cache
.
Cause : Des itinéraires en double sont définis dans le fichier de routage.
Plan de modification : recherchez les itinéraires en double dans le fichier de routage et modifiez-les. Sachez notamment que les méthodes resource
sont susceptibles d'entraîner une duplication de leurs méthodes.
Cette erreur est signalée lors de l'exécution de php artisan optimize --force
naming.
Cause : Le fichier correspondant n'a pas été trouvé lors du chargement de la classe à compiler. Le chemin du fichier à compiler est défini dans vendor/laravel/framework/src/Illuminate/Foundation/Console/Optimize/config.php
de la version 5.2, mais je ne sais pas pourquoi /vendor/laravel/framework/src/Illuminate/Database/Eloquent/ActiveRecords.php
n'a pas été trouvé, donc cette erreur a été signalée.
Plan de modification : commentez temporairement la ligne ../ActiveRecords.php
dans le config.php ci-dessus.
Après l'exécution de php artisan config:cache
, cette erreur est signalée lors de l'accès à la page d'accueil de l'application Laravel sur le navigateur.
Raison : Le serveur d'applications Laravel est construit sur une machine virtuelle utilisant Homestead. J'ai exécuté cette commande en dehors de la machine virtuelle, ce qui a fait que le chemin dans le config.php généré était le chemin local, et non le chemin sur la machine virtuelle. Le fichier de vue est donc introuvable.
Plan de modification : connectez-vous en SSH à la machine virtuelle et exécutez cette commande.
Les pièges ont été surmontés et les tests ont été effectués. Voici un bref résumé des compétences pratiques basées sur cette expérience.
Désactiver le débogage de l'application app.debug=false
Informations de configuration du cachephp artisan config:cache
Informations de routage du cachephp artisan router:cache
Optimisation du chargement des cartes de classes php artisan optimize
(inclut l'optimisation du chargement automatique composer dumpautoload
)
Chargez uniquement le middleware nécessaire si nécessaire
Utilisez des compilateurs juste à temps (JIT), tels que : HHVM, OPcache
. resouce
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!