XHProf unter Windows und XAMPP installieren

XHProf ist ein Profiling Werkzeug für PHP. Da die meisten Webserver mit Linux laufen, ist der Aufwand XHProf über das Paketmanagement zuzuschalten sehr überschaubar.

Interessant wird es unter Windows. Da sind einige Schritte durchzuführen.

Ich gehe im Beispiel von einer XAMPP Spielwiese aus, wobei XAMPP unter C:\xampp installiert ist.

Des weiteren gehe ich von einem hypothetischen Projekt „lahmekruecke“ aus, das im Verzeichnis C:\xampp\htdocs\lahmekruecke liegt.

Schritt 1:

XHProf ist eine PHP-Extension. Wir brauchen also die php_xhprof.dll

Die gibt es hier zu Download: http://www.phpfluesterer.de/[…]/xhprof-fur-windows-aktuelle-windows-builds/.

Die Datei php_xhprof.dll in das Verzeichnis C:\xampp\php\ext ablegen.

Nun noch die Extension aktivieren und konfigurieren. Dazu die Datei C:\xampp\php\php.ini öffnen und folgende Zeilen ergänzen (ca Zeile 1030):

extension=php_xhprof.dll

[xhprof]
xhprof.output_dir="C:\xampp\tmp\xhprof"

Nun noch das Verzeichnis C:\xampp\tmp\xhprof anlegen. Stellen Sie in den Eigenschaften des Ordners sicher, dass er nicht schreibgeschützt ist.

Schritt 2:

Wir haben nur die DLL, in den Online-Beispielen gibt’s aber fertige PHP Includes – und die brauchen wir auch … wo sind die?
Hier den kompletten XHProf Code ziehen: https://github.com/facebook/xhprof (ZIP Download)

Erstellen Sie eine Verzeichnis C:\xampp\htdocs\xhprof

Das ZIP direkt in das neue Verzeichnis entpacken, so dass folgender Pfad entsteht: C:\xampp\htdocs\xhprof\xhprof-master\xhprof_lib

Schritt 3:

Jetzt muss das noch in den PHP-Code verbaut werden. Idealerweise „Start“ und „Stop“ in eine Include-Datei ausgelagert. Meine Vorlage ist von diesem Beitrag: http://techportal.inviqa.com/2009/12/01/profiling-with-xhprof/

Eine neue Datei C:\xampp\htdocs\xhprof\xhprof_start.php erzeugen mit folgendem Inhalt:

<?php
if (extension_loaded('xhprof')) {
    include_once __DIR__.'/xhprof-master/xhprof_lib/utils/xhprof_lib.php';
    include_once __DIR__.'/xhprof-master/xhprof_lib/utils/xhprof_runs.php';
    xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
}

Eine neue Datei C:\xampp\htdocs\xhprof\xhprof_stop.php erzeugen mit folgendem Inhalt:

<?php
if (extension_loaded('xhprof')) {
    $profiler_namespace = 'myapp';  // namespace for your application
    $xhprof_data = xhprof_disable();
    $xhprof_runs = new XHProfRuns_Default();
    $run_id = $xhprof_runs->save_run($xhprof_data, $profiler_namespace);
    $profiler_url = sprintf('http://localhost/xhprof/xhprof-master/xhprof_html/index.php?run=%s&source=%s', $run_id, $profiler_namespace);
    echo '<a href="'. $profiler_url .'" target="_blank">Profiler output</a>';
}

Schritt 4:

Angenommen es gibt eine hypothetische index.php im Projekt „lahmekruecke“. Dort setzen Sie die zwei Dateien als Include:

<?php
include "../xhprof/xhprof_start.php"
[...]
include "../xhprof/xhprof_stop.php"
?>

Rufen Sie nun das hypothetische http://localhost/lahmekruecke/index.php auf.

Am unteren Seitenrand taucht der Link „Profiler output“ auf. Klick öffnet das Profiler Ergebnis in einer HTML-Seite in Tabellen-Form.

Auf der Seite gibt es einen Graph-Link. Der funktioniert noch nicht. Dafür ist eine weitere Software zu installieren.

Schritt 5:

Für die Anzeige des Call-Graphen, wird das Linux-Konsolenprogramm „dot“ benötigt – bzw GraphViz. Eine Windows-Version von GraphViz gibt es hier zum Download:
http://www.graphviz.org/Download_windows.php

Passen Sie die Datei C:\xampp\htdocs\xhprof\xhprof-master\xhprof_lib\utils\callgraph_utils.php an und ändern die etwa in Zeile 112:

Alt: $cmd = " dot -T".$type;
Neu: $cmd = "\"C:\\Program Files (x86)\\Graphviz2.30\\bin\\dot.exe\" -T".$type;

Ggf ist der Pfad bei Ihnen leicht anders.

Alternativ können Sie

  • Das Graphviz2.30/bin Verzeichnis in die PATH Variable aufnehmen
  • Eine dot.bat in C:\Windows erstellen, und die Parameter durchschleifen
  • Die dot.exe nach C:\Windows kopieren.

Nun funktioniert auch der Call-Graph. Viel Spaß!

Add Comment

Required fields are marked *. Your email address will not be published.