Skip to content
XHGUI is a GUI for the XHProf PHP extension, using a database backend, and pretty graphs to make it easy to use and interpret.
Branch: master
Clone or download
#115 Compare This branch is 320 commits ahead, 64 commits behind phacility:master.
aik099 Merge pull request #118 from viafoura/custom-xhprof-locations
Allow defining custom locations for xhprof_lib and config.php
Latest commit 2302bf7 Aug 15, 2018
Type Name Latest commit message Commit time
Failed to load latest commit information.
examples Fixed the URL in sample.php Jun 16, 2010
extension Bug 64165: Fix RDTSC calibration Mar 28, 2013
external Allow defining XHPROF_LIB_ROOT and XHPROF_CONFIG everywhere with a de… Aug 15, 2018
xhprof_html Allow defining XHPROF_LIB_ROOT and XHPROF_CONFIG everywhere with a de… Aug 15, 2018
xhprof_lib Allow defining XHPROF_LIB_ROOT and XHPROF_CONFIG everywhere with a de… Aug 15, 2018
.arcconfig update from master May 17, 2012
.gitignore Also ingoring PhpStorm's files May 8, 2015
CHANGELOG add support to ignore specified functions during profiling; more tests May 27, 2009
INSTALL fixing path to config.php in INSTALL Feb 25, 2013
LICENSE update from master May 17, 2012
README.HIGHCHARTS - Adding readme for HighCharts Jun 10, 2010
README.markdown Remove one of the related tools. Feb 4, 2018
package.xml request #16544: mac port for XHProf (Svilen Spasov) May 30, 2009



This is a graphical front end designed to store and present the profiling information provided by the Facebook created XHProf profiling tool.

Related Tools

  • XHGui - Uses MongoDB as a backend (rather than MySQL)

Project Includes

  • It includes a header.php document you can use with PHP's auto_prepend_file directive. It sets up profiling by initilizing a few variables, and settting register_shutdown_function with the footer. Once started profiles are done when requested (?_profile=1), or randomly. Profiled pages display a link to their profile results at the bottom of the page (this can be disabled on a blacklist based for specific documents. e.g. pages generating XML, images, etc.).
  • For tips on including header.php on an nginx + php-fpm install take a look at:
  • The GUI is a bit prettier (Thanks to Graham Slater)
  • It uses a MySQL backend, the database schema is stored in xhprof_runs.php
  • There's a frontend to view different runs, compare runs to the same url, etc.

Key Features

  • Listing 25, 50 most recent runs
  • Display most expensive (cpu), longest running, or highest memory usage runs for the day
  • It introduces the concept of "Similar" URLs. Consider:
  • Highcharts is used to graph stats over requests for an easy heads up display.


Besides a simple PHP running on your favourite web server you will also need following packages:

  • php5-xhprof
  • php5-mysql
  • graphviz (uses dot to generate callgraphs)


  • Install your favourite mix of PHP and web server
  • Install MySQL server
  • Clone the project to some folder
  • Map the sub folder xhprof_html to be accessible over HTTP
  • Move xhprof_lib/config.sample.php to xhprof_lib/config.php
  • Edit xhprof_lib/config.php
  • Update the SQL server configuration
  • Update the URL of the service (should point to xhprof_html over HTTP)
  • Update the dot_binary configuration - otherwise no call graphs!
  • Update the controlIPs variable to enable access.
  • For a development machine you can set this to false to disable IP checks.
  • Import the DB schema (it is just 1 table)
  • See the SQL at xhprof_runs.php
  • Add a PHP configuration to enable the profiling
  • If using Apache you can edit your virtual host configuration
  • Add php_admin_value auto_prepend_file "/path/to/xhprof/external/header.php"
  • Visit http://your-server/xhprof/xhprof_html/ and be amazed!
  • To get profiler information showing up there visit your page with a GET variable _profile=1.
  • For example http://localhost/?_profile=1

We Are Working On

  • The aggregation functionality is ignored completely
  • The code is... a mess. Deadlines do that to you, we're working on it
  • The default table schema isn't indexed all the places it needs to be
  • Easier ways to diff URLs
You can’t perform that action at this time.