Maison  >  Article  >  développement back-end  >  Comment utiliser xhprof pour tester les performances de PHP en PHP7 ? (Présentation de la méthode)

Comment utiliser xhprof pour tester les performances de PHP en PHP7 ? (Présentation de la méthode)

青灯夜游
青灯夜游avant
2020-07-15 17:11:474768parcourir

Comment utiliser xhprof pour tester les performances de PHP en PHP7 ? (Présentation de la méthode)

Introduction

1 Contexte

  • L'extension xhprof de PHP Facebook ne sera plus mise à jour et maintenue car Facebook a entièrement utilisé HHVM et n'utilise plus le moteur PHP zend.

  • xhprof ne prend pas en charge la nouvelle version de PHP (PHP7). L'extension tideways est issue du projet xhprof et continue d'être maintenue pour le moment. 5.6 et 5.5.

  • tideways est un projet open source. Il ne facture que les services d'interface utilisateur. En fait, xhgui peut répondre pleinement à nos besoins quotidiens

2 Fonctions

Tideways est une extension utilisée pour tester les performances de PHP. Elle peut obtenir les fonctions appelées pendant tout le processus d'exécution de PHP, le nombre d'appels de fonctions, le temps d'exécution. , temps CPU et utilisation de la mémoire, pic de mémoire, temps d'exécution total, temps CPU total, utilisation totale de la mémoire, pic de mémoire total et autres données, analysez les données ci-dessus pour découvrir le goulot d'étranglement des performances de PHP, analysez le processus d'exécution de PHP, etc.

3 Avantages

  • tideways est une extension PHP, combinée avec xhgui, pas besoin de l'enterrer dans le PHP code Le code de surveillance

  • peut définir la fréquence d'exécution (par exemple, 1/100) sans générer de journaux d'exécution pour chaque requête, ce qui entraîne une perte de performances et peut également contrôler activement la génération ; journaux d'exécution en demandant des paramètres à contrôler (debug=1)

  • Il existe une interface utilisateur simple et directe pour transformer les données

  • Vous pouvez librement faire correspondre les conditions de filtrage des données. Par exemple, analyser une interface spécifique, analyser la situation de la demande d'interface dans une certaine période de temps, etc.

4 Inconvénients

Bien que non intrusive, si des logs d'exécution sont générés pour chaque interface, la consommation de CPU et de mémoire n'est pas négligeable.

5 Principe de mise en œuvre

    L'extension tideways est responsable de la génération des journaux en cours d'exécution
  • Dans nginx, fastcgi_param PHP_VALUE auto_prepend_file est configuré, exécutez le fichier PHP configuré avec auto_prepend_file avant le début de la requête. La méthode register_shutdown_function est utilisée dans le fichier, tideways_disable est appelée pour implémenter l'intégration de tideways. Ensuite, le journal d'exécution est stocké dans mongodb ou mysql. ou un fichier, et affichés après analyse par xhgui , les formats d'affichage incluent un graphique à barres, un flux en cascade et un graphique en flammes.

Application

Les deux méthodes d'application suivantes sont présentées :

Intrusive et Non invasive

Le mode intrusif fait référence à l'ajout de code au code, et le mode intrusif utilise l'interface utilisateur par défaut.

Le mode non intrusif fait référence à l'ajout de code sans apporter de modifications au code. Modifiez nginx/apache pour implémenter l'injection de code, en utilisant xhgui de manière non invasive ;

Installez

tideways_xhprof

git clone "https://github.com/tideways/php-xhprof-extension.git"
cd php-xhprof-extension
phpize
./configure --with-php-config=/usr/local/php7/bin/php-config
make
sudo make install
Ajoutez l'extension=tideways_xhprof.so

Non intrusif :

<?php
tideways_xhprof_enable();

// your application code

$data = tideways_xhprof_disable();
file_put_contents(
    sys_get_temp_dir() . "/" . uniqid() . ".yourapp.xhprof",
    serialize($data)
);

  // $data = tideways_xhprof_disable();
  // file_put_contents(
  //     sys_get_temp_dir() . "/" . date(&#39;His&#39;, time()) . ".material.xhprof",
  //     serialize($data)
  // );
Le fichier .xhprof généré ici se trouve dans le répertoire tmp. L'interface utilisateur par défaut recherchera également .xhprof dans le répertoire tmp. . Fichiers

Installez l'interface utilisateur par défaut pour rechercher des données

git clone git@github.com:phacility/xhprof.git
Installez les répertoires

et

de ce référentiel dans votre Web. dossier et naviguez xhprof_lib pour voir la liste des traces. xhprof_htmlxhprof_html/index.phpSi vous souhaitez voir les notes d'appel de fonction, vous devez installer Callgraph

Installer CallgraphCallgraph est en fait un une combinaison de trois outils devient.

L'un est cflow ou calltree, qui est utilisé pour générer un arbre d'appel de fonction C. Ce qui suit présente principalement cflow.

Un outil pour travailler avec le langage graphique de texte par points, amélioré par graphviz.

Un script pour convertir l'arbre d'appel de fonction C au format point : tree2dotx

Prenons Ubuntu comme exemple, installez-les respectivement :

sudo apt-get install cflow graphviz

Installez ensuite tree2dotx et Callgraph , les voici sont installés dans /usr/local/bin par défaut.

wget -c https://github.com/tinyclub/linux-0.11-lab/raw/master/tools/tree2dotx
wget -c https://github.com/tinyclub/linux-0.11-lab/raw/master/tools/callgraph
sudo cp tree2dotx callgraph /usr/local/bin
sudo chmod +x /usr/local/bin/{tree2dotx,callgraph}

Les deux rendus suivants sont affichés :

>

 L'utilisation intrusive de xhgui nécessite mongodb

Installer xhgui

git clone git@github.com:perftools/xhgui.git

Configurer Nginx

server {
  listen 80;
  server_name site.localhost;
  root /Users/markstory/Sites/awesome-thing/app/webroot/;
  fastcgi_param PHP_VALUE "auto_prepend_file=/home/www/xhgui/external/header.php";  #这里依据个人目录而配
}
Ce que cela signifie ici, c'est d'exécuter header.php avant d'exécuter le code php du projet, afin que pour atteindre l'objectif de performances de détection non intrusives

configuration xhgui (Fréquence de génération des journaux) Dans config/config.default de xhgui. php, le nombre de hits d'échantillonnage peut être défini

;

return rand(1, 100) === 42; 为1%的采样率,改成return True;则标识每次都采样

&#39;profiler.enable&#39; => function() {
   // url 中包含debug=1则百分百捕获
   if(!empty($_GET['debug'])){
       return True;
   }else{
       // 1%采样
       return rand(1, 100) === 42;
   }
}

mongodb的配置

   xhgui/config/config.default.php

// Can be either mongodb or file.
   /*
   'save.handler' => 'file',
   'save.handler.filename' => dirname(__DIR__) . '/cache/' . 'xhgui.data.' . microtime(true) . '_' . substr(md5($url), 0, 6),
   */
   'save.handler' => 'mongodb',
   // Needed for file save handler. Beware of file locking. You can adujst this file path
   // to reduce locking problems (eg uniqid, time ...)
   //'save.handler.filename' => __DIR__.'/../data/xhgui_'.date('Ymd').'.dat',
   'db.host' => 'mongodb://127.0.0.1:27017',
   'db.db' => 'xhprof',

mongo服务器的配置

mongo
 > use xhprof
 > db.results.ensureIndex( { 'meta.SERVER.REQUEST_TIME' : -1 } )
 > db.results.ensureIndex( { 'profile.main().wt' : -1 } )
 > db.results.ensureIndex( { 'profile.main().mu' : -1 } )
 > db.results.ensureIndex( { 'profile.main().cpu' : -1 } )
 > db.results.ensureIndex( { 'meta.url' : 1 } )

最后展示几张xhgui的效果图

 

 

 

 相关学习推荐:PHP编程从入门到精通

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer