Question

Voici ma première question, DONC.

J'ai une application interne pour mon entreprise que j'ai été récemment demandez à maintenir.Les applications est construit en PHP et il est très bien codé (OO, DB Abstraction, Smarty) rien de WTF-esque.

Le problème est que les applications est très lent.

Comment puis-je trouver ce qui est le ralentissement de la demande?J'ai optimisé le code pour faire très peu de requêtes DB, donc je sais que c'est le code PHP qui prend un certain temps à s'exécuter.J'ai besoin de quelques outils qui peuvent m'aider à ce sujet et la nécessité de concevoir une stratégie pour la vérification de mon code.

Je peux faire la vérification et de la stratégie de travail moi-même, mais j'ai besoin de plus d'outils PHP pour comprendre d'où mon application est chier en place.

Pensées?

Était-ce utile?

La solution

J'ai utilisé XDebug de profilage récemment, dans une semblable situation.Elle génère un profil complet de rapport qui peut être lu avec beaucoup de profilage des applications ( ne Peut pas vous donner une liste même si, je viens d'utiliser celui qui est venu avec slackware ).

Autres conseils

Juan mentionné, xDebug est excellent.Si vous êtes sur Windows, WinCacheGrind vous permettra de regarder sur les rapports.

Regardez cette présentation par Rasmus Lerdorf (créateur de PHP).Il va dans quelques bons exemples de tests de vitesse PHP et ce que vous recherchez ainsi que certains éléments internes qui peuvent ralentir les choses.XDebug est un outil qu'il utilise.Il fait aussi un très bon point au sujet de savoir quelles sont les performances de coûts que vous obtenez dans avec les cadres.

Vidéo:http://www.archive.org/details/simple_is_hard

Les diapositives (car c'est difficile à voir sur la vidéo):http://talks.php.net/show/drupal08/1

Il y a beaucoup de variables qui peuvent affecter les performances de votre application.Je vous recommande de ne pas instantanément assumer PHP est le problème.

Tout d'abord, comment vous servir de PHP?Avez-vous essayé d'optimisation de base d'Apache ou IIS lui-même?Le serveur est occupé à traiter d'autres types de demandes?Avez-vous profité d'une Le code PHP accelerator?Une façon de tester si le serveur est votre goulot d'étranglement est d'essayer de lancer l'application sur un autre serveur.

Deuxièmement, la performance de l'ensemble de l'application lente, ou ça ne semblent influer sur certaines pages?Cela pourrait vous donner une indication de l'endroit où pour commencer l'analyse de la performance.Si l'ensemble de l'application est lente, le problème est plus probable dans le serveur sous-jacent/plate-forme ou avec une requête SQL qui fait partie de chaque demande (authentification de l'utilisateur, par exemple).

Troisièmement, vous avez mentionné en minimisant le nombre de requêtes SQL, mais ce que sur l'optimisation des requêtes existantes?Si vous utilisez MySQL, êtes-vous en profitant des différents points forts de chaque système de stockage?Avez-vous exécuté EXPLIQUER sur votre la plupart des requêtes importantes pour s'assurer qu'ils sont correctement indexées?C'est critique sur les requêtes qui ont accès à de grandes tables;plus le jeu de données, plus vous remarquerez les effets d'une mauvaise indexation.Heureusement, il existe de nombreux articles comme celui-ci qui expliquent comment utiliser l'EXPLIQUER.

Quatrièmement, une erreur courante est de supposer que votre serveur de base de données sera automatiquement utiliser toutes les ressources disponibles pour le système.Vous devriez assurez-vous que vous avez explicitement des ressources suffisantes pour votre application de base de données.Dans MySQL, par exemple, vous pouvez ajouter des paramètres personnalisés (dans votre mon.cnf de fichier) pour des choses comme la clé de la mémoire tampon, de la table temporaire de la taille, du fil de simultanéité, innodb pool de mémoire tampon de taille, etc.

Si vous avez vérifié tous les ci-dessus et ne le trouvez toujours pas le goulot d'étranglement, un profileur de code comme Xdebug peut certainement aider.Personnellement, je préfère le Zend Studio profiler, mais il peut ne pas être la meilleure option, sauf si vous êtes déjà profité du reste de la Zend Platform pile.Cependant, dans mon expérience, il est très rare que PHP lui-même est la cause principale de la lenteur de la performance.Souvent, un profileur de code peut vous aider à déterminer avec plus de précision ce qui les requêtes DB sont à blâmer.

phpED (http://www.nusphere.com/products/phped.htm) offre également une grande débogage et le profilage et la possibilité d'ajouter des montres, des points d'arrêt, etc dans le code PHP.Le profiler intégré directement offre un temps de ventilation de chaque appel de fonction de classe et de méthode à partir de l'IDE.Plug-ins de navigateur aussi de permettre une intégration rapide avec Firefox ou IE (c'est à direvisite lent URL dans le navigateur, puis cliquez sur le bouton de profil ou de débogage).

C'est très utile en soulignant où l'application est lente afin de se concentrer plus l'effort de codage;et ça évite de perdre du temps en optimisant déjà code rapide.Après avoir essayé de Zend et Eclipse, j'ai été vendu sur la facilité d'utilisation de phpED.

Gardez à l'esprit les deux Xdebug et phpED (avec DBG) aura besoin d'un module PHP installé lors du débogage à l'encontre d'un serveur web.phpED propose également (prévenus par moi) un local option de débogage de trop.

Xdebug profil est certainement le chemin à parcourir.Une autre astuce - WincacheGrind est bon, mais n'avait pas été mis à jour récemment. http://code.google.com/p/webgrind/ - dans un navigateur peut être un moyen facile et rapide de remplacement.

Les Chances sont que si, elle est toujours la base de données de toute façon.Vérifier la pertinence de l'index - et qu'il dispose de suffisamment de mémoire pour le cache autant de données que possible.

Vous pouvez également utiliser La DGPA (Advanced PHP Debugger).

Il est très facile à faire fonctionner.

$ php apd-test.php

$ pprofp -l pprof.SOME_PID

Trace for /Users/martin/develop/php/apd-test/apd-test.php
Total Elapsed Time = 0.12
Total System Time  = 0.01
Total User Time    = 0.07


         Real         User        System             secs/    cumm
%Time (excl/cumm)  (excl/cumm)  (excl/cumm) Calls    call    s/call  Memory Usage Name
--------------------------------------------------------------------------------------
71.3 0.06 0.06  0.05 0.05  0.01 0.01  10000  0.0000   0.0000            0 in_array
27.3 0.02 0.09  0.02 0.07  0.00 0.01  10000  0.0000   0.0000            0 my_test_function
 1.5 0.03 0.03  0.00 0.00  0.00 0.00      1  0.0000   0.0000            0 apd_set_pprof_trace
 0.0 0.00 0.12  0.00 0.07  0.00 0.01      1  0.0000   0.0000            0 main

Il y a un bon tutoriel comment compiler APD et de profilage avec elle : http://martinsikora.com/compiling-apd-for-php-54

fi de son une grosse base de code essayez apc, si vous n'êtes pas déjà.

http://pecl.php.net/package/APC

vous pouvez également essayer d'utiliser le register_tick_function fonction en php.qui dit à php pour appeler une fonction periodcally grâce à votre code.Vous pouvez garder une trace de la fonction est actuellement en cours d'exécution et la quantité de temps entre les appels.ensuite, vous pouvez voir ce qui prend le plus de temps.http://www.php.net/register_tick_function

Nous utilisons Zend Environnement de Développement (windows).Nous avons résolu un mémoire de pic d'utilisation de hier en parcourant le débogueur lors de l'exécution de Process Explorer pour regarder la mémoire/cpu/disque activité que chaque ligne a été exécuté.

Process Explorer: http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx.

ZDE comprend un rendement de base de profils peut montrer le temps passé dans chaque appel de fonction lors de demandes de page.

J'utilise une combinaison de POIRE de Référence et log4php.

En haut de scripts je veux le profil j'ai créer un objet qui s'enroule autour d'un Benchmark_Timer objet.Dans le code, je l'ai ajouter dans $object->setMarker("name");les appels, en particulier autour du code suspect.

La classe wrapper a une méthode destroy qui prend les informations de journalisation et de l'écrit à log4php.En général, je l'envoyer à syslog (nombre de serveurs, les agrégats d'un fichier journal sur un seul serveur).

En debug, je peux regarder les fichiers journaux et de voir où j'en ai besoin pour améliorer les choses.Plus tard dans la production, je peux analyser les fichiers journaux et de faire l'analyse des performances.

Ce n'est pas xdebug, mais c'est toujours sur moi et me donne la possibilité de comparer deux exécutions du code.

Vous pouvez également regarder la HA Proxy ou toute autre solution d'équilibrage de charge si votre serveur de la dégradation des performances est la cause de la demande de ralentir le traitement.serveur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top