Ob dans le répertoire application job de lamp;rsquoapplication laraver. Habituellement, pour ce faire, devez configurer lamp;rsquoopérateur de file damp;rsquoattente, envoyer la tâche, puis attendre que lamp;rsquoauditeur de file damp;rsquoattente ramasse et exécute la tâche. Cependant, ce processus ne nous aide pas beaucoup dans lamp;rsquoanalyse du Code qui samp;rsquoexécute lorsque le travail est exécuté. Au lieu de cela, jamp;rsquoaime créer une commande artisanale spécifique pour exécuter le travail afin que puissiez lamp;rsquoexécuter avec le CLI. Continuons à créer la commande:
Php artisan make: Command execute ummyjob ceci crée la classe execute ummyjob dans le répertoire app console commands. Nous devons apporter deux changements à cette classe. Tout damp;rsquoabord, signez correctement la commande: Protected $signature = amp;lsquoapplication: Perform Virtual Jobsamp;rsquo Deuxièmement, nous devons exécuter la méthode de gestion de la classe dummyjob (ce que font habituellement les travailleurs de file damp;rsquoattente): en utilisant app Jobs dummyjob * * Exécutez les commandes de la console. Renvoie une poignée de fonction publique * mixte () {$job = new dummyjob () $Job amp;gt Handle ()} Enfin, namp;rsquooubliez pas damp;rsquoajouter nos nouvelles commandes aux classes du noyau. Php, afin que nous puissions lamp;rsquoexécuter:
Commandes artisanales fournies par lamp;rsquoapplication. Var Array * Protected $commands = [ app console commands executedummyjob:: class,] Maintenant, si nous exécutons PHP artisan app: Execute Dummy job, nous copions essentiellement ce que lamp;rsquoauditeur de file damp;rsquoattente va exécuter, sauf que nous pouvons maintenant lamp;rsquoanalyser en utilisant blackfire CLI: blackfire Run PHP artisan app: Execute Dummy job pour expliquer les résultats de blackfire dans cette section, et je vais en fait regarder Un exemple réel de mergebot, Cependant, si avez votre propre travail, ou si avez simplement configuré dummyjob et ajouté du Code au profil, pouvez lamp;rsquoutiliser comme base pour analyser les résultats. Voici les résultats de distribution pour 60 requêtes en cours damp;rsquoexécution sur V
Robot de fusion ecchio Codice:
Avant de passer à ces résultats, je recommande de lire damp;rsquoabord le document damp;rsquoanalyse sommaire de blackfire. Cela devrait donner une bonne idée du fonctionnement de la page des résultats blackfire. Ensuite, devriez noter la principale mesure des résultats de ce profil: il faut 2 minutes et 10 secondes pour fonctionner avec 22,1 Mo de mémoire. Ce seront les principaux indicateurs de rendement que nous tenterons de réduire. Dans le diagramme damp;rsquoappel principal, pouvez voir le processus damp;rsquoexécution du Code, y compris le nombre de fois que chaque méthode est appelée, et où se trouve le chemin chaud (où la plupart du temps damp;rsquoexécution est passé). La documentation blackfire recommande toujours damp;rsquoanalyser damp;rsquoabord le chemin chaud pour voir samp;rsquoil est causé par un goulot damp;rsquoétranglement évident, mais rappelez que parfois le chemin chaud est tout à fait raisonnable et namp;rsquoest pas vraiment un problème.
Dans ce cas, les deux hotpaths conduisent à fget (Read from cache) et pdostatement:: execute (perform Database query). Cela ne nous dit pas grand chose en soi. Cependant, Notez la fréquence des appels à ces méthodes. Les lecteurs de cache (fgets) ont appelé plus de 58 000 fois et exécuté plus de 8 500 requêtes de base de données, toutes pour une distribution de 60 requêtes! Pas étonnant quamp;rsquoon ait des problèmes de performance. Revenons au diagramme damp;rsquoappel et voyons si nous pouvons déterminer où le problème samp;rsquoest produit. Ah, maintenant nous pouvons voir où il y a un goulot damp;rsquoétranglement de performance évident. La méthode idrelationstodifferentinobject a été nommée 2790 fois, principalement par les méthodes getfirstupdatedata et updatevaluewithplaceholder. Cela signifie que ces méthodes peuvent appeler idrelatistodifferentitioobject dans une boucle qui se produit beaucoup plus souvent que prévu.
Nous venons de trouver lamp;emplacement des goulets damp;rsquoétranglement de performance que nous pouvons commencer à refaire.
Ce processus peut être répété autant de fois que le souhaitez jusquamp;rsquoà ce que soyez satisfait de la performance de votre code. Blackfire a également une fonctionnalité intéressante qui permet de comparer les profils pour voir les améliorations de performance. Comparons ce profil au nouveau Code de procédure de distribution réécrit que jamp;rsquoai écrit pour mergebot. La première chose à noter est lamp;rsquoamélioration des performances des principaux paramètres de temps et de mémoire: Super Scott! Ce code a un temps damp;rsquoexécution de 8% (1200% plus rapide quamp;rsquoauparavant) et prend moins de la moitié de la mémoire. Maintenant, 60 requêtes réparties de la même façon ne prennent que 10 secondes. Pas mal. Jetons un coup damp;rsquooeil au chemin populaire vers le nouveau Code.
Les chemins chauds provoquent toujours le même type damp;rsquoévénements (lecture et exécution des requêtes de base de données à partir du cache). Cependant, Notez que nous appelons ces méthodes beaucoup moins souvent quamp;rsquoauparavant. Le nombre damp;rsquoappels à pdostatement:: Execute est passé de 8700 à 674. Limiter les requêtes aux bases de données est un moyen efficace damp;rsquoaméliorer les performances. nous revenons au diagramme damp;rsquoappel, regardons ce qui se passe avec lamp;rsquoappel à la méthode. Le nombre damp;rsquoappels à la méthode idrelationstodifferentinobject est passé de 2790 à 940. Camp;rsquoest une bonne amélioration en soi, mais elle a aussi une incidence sur le nombre damp;rsquoappels à namp;rsquoimporte quelle méthode dans la méthode idrelatistodifferentitioobject. nous regardons cela dans le Graphique comparatif, nous pouvons voir comment cela affecte le temps damp;rsquoexécution. Lamp;rsquoamélioration des performances de votre application permet maintenant de configurer blackfire sur une installation laraver et de créer des profils pour comparer votre code. Le processus que nous utilisons pour créer des commandes artisanales pour chaque en tête
En théorie, les tâches en file damp;rsquoattente sur le CLI peuvent être utilisées pour tester namp;rsquoimporte quelle partie du Code qui pourrait nécessiter un profilage. Dans lamp;rsquoexemple mergebot, la principale raison du goulot damp;rsquoétranglement de performance est damp;rsquoappeler le Code sur une période beaucoup plus longue que prévu. Cela a en fait entraîné des problèmes de rendement exponentiels qui ont complètement perturbé les déploiements à grande échelle. Une façon simple de résoudre ce type de problème de performance est de reconstruire le Code pour réduire la fréquence des appels aux méthodes. Cependant, il existe plusieurs types de problèmes qui peuvent ralentir lamp;rsquoexécution du Code et chaque projet doit résoudre ses propres problèmes de rendement uniques. Quelles sont les perspectives de mergebot? Au cours des prochaines semaines, nous espérons lancer une autre fonctionnalité souvent nécessaire: le support multisite. Avez déjà analysé votre code avec blackfire? Avez des suggestions pour optimiser le Code laraver php? Quels problèmes de performance avez rencontrés dans le passé? Veuillez nous le dire dans vos commentaires. souhaitez obtenir le premier Dib pour le prochain tour de mergebot, assurez de inscrire ici. Mise à jour: souhaitez tester plus avant les tâches en file damp;rsquoattente, pourriez être intéressé par un nouveau projet que je viens de publier. Sqsd est une copie du démon AWS Elastic Beanstalk Worker SQS (sqsd) qui teste la façon dont lamp;rsquoapplication gère les tâches en file damp;rsquoattente en mode AWS.
Mergebot est maintenant 1200% plus rapide: optimisé & Application laraver avec blackfire