Heim  >  Artikel  >  Backend-Entwicklung  >  Verwenden Sie XHProf, um Fälle von PHP-Leistungsengpässen zu finden

Verwenden Sie XHProf, um Fälle von PHP-Leistungsengpässen zu finden

小云云
小云云Original
2017-12-14 10:02:121624Durchsuche

Leistungsengpässe beziehen sich im Allgemeinen auf neu entwickelte Anwendungen durch Entwickler.

Zum Beispiel

Eine Anwendung, die in Java oder C entwickelt und auf einem Anwendungsserver zur Verarbeitung von Benutzertransaktionsanfragen bereitgestellt wird.

Zum Beispiel

Ein Entwickler hat ein Zahlungsverarbeitungsprogramm entwickelt. Beim Testen wurde festgestellt, dass

dieses Zahlungsverarbeitungsprogramm gleichzeitig von Benutzern gesendete Zahlungsanfragen nicht verarbeiten konnte. , kann nur seriell und nicht parallel verarbeitet werden, was zu einer sehr langen Verarbeitungsreaktionszeit für Zahlungstransaktionen führt. Derzeit kann davon ausgegangen werden, dass in der Anwendung ein Leistungsengpass aufgetreten ist.

Dieser Artikel zeigt Ihnen ein Beispiel für die Verwendung von XHProf zum Auffinden von PHP-Leistungsengpässen. Es hat einen guten Referenzwert und ich hoffe, dass es allen helfen kann.

XHProf ist eine von Facebook entwickelte Erweiterung zum Testen der PHP-Leistung. In diesem Artikel wird die Methode zur Verwendung von XHProf zur Optimierung der PHP-Leistung und zum Auffinden von Leistungsengpässen in PHP-Anwendungen beschrieben.

1. Xhprof-Erweiterung installieren

//github上下载https://github.com/facebook/xhprof
unzip xhprof-master.zip 
cd xhprof-master/extension/
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config --enable-xhprof
make && make install

2. php.ini ändern

[xhprof]
extension=xhprof.so
xhprof.output_dir=/tmp

In der Konfiguration gibt xhprof.output_dir den Speicherort der generierten Profildatei an Wir geben es als /tmp an.

3. Verschieben Sie die relevanten Dateien in das Projekt

//xhprof下载压缩包中的xhprof_html和xhprof_lib
cp -r xhprof-master/xhprof_html /usr/local/nginx/html/xhprof/
cp -r xhprof-master/xhprof_lib /usr/local/nginx/html/xhprof/

Konfigurieren Sie einen Domänennamen und der Browser kann auf http://will.com/xhprof/xhprof_html/index.php zugreifen

server{
 listen 80;
 server_name will.com;
 location / {
  root /usr/local/nginx/html;
  index index.html;
 }
 location ~ \.php$ {
  root html;
  fastcgi_pass 127.0.0.1:9000;
  fastcgi_index index.php;
  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  include  fastcgi_params;
 }
 }

4. Installieren Sie graphivz

//需要安装graphviz否则查看性能图片时候会报failed to execute cmd: " dot -Tpng". stderr: `sh: dot: command not found '
yum -y install graphviz

5. Schreiben Sie Testdateien

//入口文件的开始位置
xhprof_enable(XHPROF_FLAGS_MEMORY | XHPROF_FLAGS_CPU);

业务逻辑...

//业务逻辑结束后
$xhprof_data = xhprof_disable();
include_once "/usr/local/nginx/html/xhprof/xhprof_lib/utils/xhprof_lib.php"; 
include_once "/usr/local/nginx/html/xhprof/xhprof_lib/utils/xhprof_runs.php"; 
$objXhprofRun = new XHProfRuns_Default();//数据会保存在php.ini中xhprof.output_dir设置的目录去中 
$run_id = $objXhprofRun->save_run($xhprof_data, "test");

Komplettes Codebeispiel (zufällige rote Umschlag-Demo)

<?php
xhprof_enable(XHPROF_FLAGS_MEMORY | XHPROF_FLAGS_CPU);
function show($info)
{
 echo "<pre class="brush:php;toolbar:false">";
 print_r($info);
}

//不作数据校验
$rules = array(
 2=>array('min'=>1, 'max'=>10, 'chance'=>30),//金额:分 概率:百分之(默认为100%,不足100%按第一档计算)
 array('min'=>11, 'max'=>25, 'chance'=>60),
 array('min'=>26, 'max'=>50, 'chance'=>10),
 array('min'=>50, 'max'=>80, 'chance'=>0),
 array('min'=>80, 'max'=>100, 'chance'=>0),
);
$total_money = 10000;//红包总金额
$res = array();
while($total_money>0)
{
 $index = getLevel($rules);
 $money = setMoney($rules, $index);
 if ($money > $total_money)//金额不足
 {
 $money = $total_money;
 $total_money = 0;
 } else {
 $total_money -= $money;
 }
 $res[] = ($index+1)."---".$money;
}
echo show($res);
echo $total_money . "<br/>";
//1.先确定档次
function getLevel($rules)
{
 $level = array();
 $chance = 0;
 foreach($rules as $k=>$v)
 {
 if ($v['chance']>0)
 {
  $chance += $v['chance']*100;//扩大100倍
  $level[$k] = $chance;
 }
 }
 $index = 0;
 $rand_num = mt_rand(1, 10000);
 foreach($level as $k=>$v)
 {
 if ($rand_num <= $v)
 {
  $index = $k;
  break;
 }
 }
 return $index;
}
//2.确定档次之后,再确定金额
function setMoney($rules, $index)
{
 $money = mt_rand($rules[$index][&#39;min&#39;]*10000, $rules[$index][&#39;max&#39;]*10000)/10000;
 $money = ceil($money);
 $money > 1 && $money = $money -1;//防止出现免单情况
 return $money;
}
$xhprof_data = xhprof_disable();
include_once "/usr/local/nginx/html/xhprof/xhprof_lib/utils/xhprof_lib.php"; 
include_once "/usr/local/nginx/html/xhprof/xhprof_lib/utils/xhprof_runs.php"; 
$objXhprofRun = new XHProfRuns_Default();//数据会保存在php.ini中xhprof.output_dir设置的目录去中 
$run_id = $objXhprofRun->save_run($xhprof_data, "test");
echo "http://will.com/xhprof/xhprof_html/index.php?run=$run_id&source=test";//变量$runId是本次请求生成分析结果的id,最后我们输出了一个链接地址,使用改地址就可以看到本次请求的分析结果。

6. Überprüfen Sie die Analyseergebnisse

Führen Sie zuerst den Geschäftscode aus;

Öffnen Sie dann http://will.com/xhprof/xhprof_html/index.php im Browser und klicken Sie auf letztes Mal, um die xhprof-Datei zu generieren

Beachten Sie den Link „Vollständiges Callgraph anzeigen“ in der Mitte, über den wir die grafischen Analyseergebnisse sehen können

Die roten Teile im Bild sind Teile mit geringer Leistung und langem Zeitverbrauch. Wir können den Systemcode danach optimieren, welche Funktionen rot markiert sind

Außerdem ist die Bedeutung von xhprof Berichtsfelder:

Funktionsname: Methodenname.

Aufrufe: Die Häufigkeit, mit der die Methode aufgerufen wurde.

Aufrufe %: Die Anzahl der Methodenaufrufe als Prozentsatz der Gesamtzahl der Methodenaufrufe auf derselben Ebene.

Incl.Wall Time (Mikrosekunden): Die Zeit, die für die Methodenausführung benötigt wird, einschließlich der Ausführungszeit von Untermethoden. (Einheit: Mikrosekunden)

IWall%: Der Prozentsatz der für die Methodenausführung aufgewendeten Zeit.

Exkl. Wall Time (Mikrosekunden): Die Zeit, die zum Ausführen der Methode selbst benötigt wird, ohne die Ausführungszeit von Untermethoden. (Einheit: Mikrosekunden)

EWall%: Der Prozentsatz der Zeit, die für die Ausführung der Methode selbst aufgewendet wurde.

Inkl. CPU (Mikrosekunden): Die für die Methodenausführung aufgewendete CPU-Zeit, einschließlich der Ausführungszeit von Untermethoden. (Einheit: Mikrosekunden)

ICpu%: Der Prozentsatz der CPU-Zeit, die für die Methodenausführung aufgewendet wird.

Exkl. CPU (Mikrosekunden): Die CPU-Zeit, die für die Ausführung der Methode selbst aufgewendet wurde, ohne die Ausführungszeit von Untermethoden. (Einheit: Mikrosekunden)

ECPU%: Der Prozentsatz der CPU-Zeit, die für die Ausführung der Methode selbst aufgewendet wurde.

Incl.MemUse(bytes): Der von der Methodenausführung belegte Speicher, einschließlich des von der Untermethodenausführung belegten Speichers. (Einheit: Bytes)

IMemUse%: Der Prozentsatz des durch die Methodenausführung belegten Speichers.

Excl.MemUse(bytes): Der von der Ausführung der Methode selbst belegte Speicher, ausgenommen der von der Ausführung von Untermethoden belegte Speicher. (Einheit: Bytes)

EMemUse%: Der Prozentsatz des Speichers, der durch die Ausführung der Methode selbst belegt wird.

Incl.PeakMemUse(bytes): Incl.MemUse-Spitzenwert. (Einheit: Bytes)

IPeakMemUse%: Incl.MemUse-Spitzenprozentsatz.

Excl.PeakMemUse(bytes): Excl.MemUse-Spitzenwert. Einheit: (Byte)

EPeakMemUse%: Excl.MemUse-Spitzenprozentsatz.

Verwandte Empfehlungen:

JavaScript-Startup-Performance-Engpassanalyse und Lösungen

Verwenden Sie xdebug, um PHP-Programme zu analysieren und die herauszufinden Leistungsengpässe

Verfolgen Sie Leistungsengpässe bei PHP-Code

Das obige ist der detaillierte Inhalt vonVerwenden Sie XHProf, um Fälle von PHP-Leistungsengpässen zu finden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn