PHP-code profiling. XHprof — hierarchical profiler with html-interface


What’s profiling?

Profiling – is a process of application performance analysis done for the purpose of acquiring data about efficiency (a set of characteristics like CPU times, RAM and resources processing, number of function calls and so on). Accordingly the instrument used for that is called a profiler.

Profilers in most cases are used to find hot-spots in the application (a hot-spot is a part in the code which processing time is inexcusably long) and also for analysis and evaluation of application quality.

PHP-code profiling

The most popular PHP-profilers are:
Xdebug's Profiler ( and XHprof ( We’ll talk about the second one here.

About XHprof

XHprof is a hierarchical profiler for PHP with HTML interface. The core is written in C language (the code is ultimately PHP on the level of reports and interface), and for download it’s available as extension for PHP. This profiler knows how to collect data about memory usage, processor resources, number and order of calls of functions and also inclusive time (time spent for the function and all functions started by it) and exclusive time (time spent for the function with no regard to the time taken by the embedded function).

Additionally, XHprof supports ability to compare two runs (hierarchical DIFF report) and aggregate results from multiple runs for data averaging.

XHprof Install

 XHprof (version 0.9.2, starting with PHP 5.2.0) is available as PECL-package since July 1, 2009. By the way, it’s not available for Windows.

Installation process is as follows:

pecl download xhprof-0.9.2
tar -xvf xhprof-0.9.2.tar.gz
cd xhprof-0.9.2/extension
make install 

Then a module in php.ini must be enabled:

Setting reports interface

XHprof module has an ability to build text and graphic reports.

There are two folders xhprof_html (access to UI и GUI) and xhprof_lib (library for data analysis) in installation directory.

Second folder depending on OS should be placed in /usr/local/share/php/ or /usr/local/lib/php/ (providing global access to library by that).

Then an access to UI should be made. For that a new domain or subdomain must be created on server and a folder xhprof_html (as an option xhprof_lib can also be put here) must be put into it.

To start a profiler:


Here XHPROF_FLAGS_CPU and XHPROF_FLAGS_MEMORY indicate to a profiler that data needs to be collected, processor usage and OS.

Disabling work of profiler:

$xhprof_data = xhprof_disable();

Saving data:

include_once dirname(__FILE__) . '/xhprof_lib/utils/xhprof_lib.php';
include_once dirname(__FILE__) . '/xhprof_lib/utils/xhprof_runs.php';
$namespace = $_SERVER['SERVER_NAME']; 
$xhprof_runs = new XHProfRuns_Default(); 
$run_id = $xhprof_runs->save_run($xhprof_data, $namespace);

Generating link for report view:

print sprintf('http://<xhprof_domain>/xhprof_html/index.php?run=%s&source=%s', $run_id, $profiler_namespace);. 

Graphic interface

XHprof also has an in-built graphic interface.

As for me they don’t have any noticeable value but I still can't help mentioning it :) .

For its proper operation Graphviz application must be installed on the server (it's included into most Linux distributives). html interface being configured you can use graphic one without any other moves (link [View Full Callgraph] in reports).

After the first usage one can come across the following error:

Warning: proc_open() [function.proc-open]: open_basedir restriction in effect. File(/dev/null) is not within the allowed path(s)

It means that a user under whose name the script has been run has no access to null device (/dev/null). Two options: allow such access with the help of property open_basedir в php.ini or change line 108 of file /xhprof_lib/utils/callgraph_utils.php replacing "/dev/null" by any value to which our script will have access (for example I replaced by "/tmp/xhprof_stderr" for testing).

Profiling “live” applications

It’s clear that profiling in test environment may differ a lot from what we have on live site.

That’s why I can’t help mentioning one important factor about XHprof: this module was used for work with live applications. And it has native realization which implies excellent efficiency.

So it can be easily used on live projects. For example, a launch can be done only once in hundred requests to server:

if (rand(1, 100) == 1) { 
   $xhprof_enable = TRUE; 

// application execution 

 if ($xhprof_enable) { 
   $xhprof_data = xhprof_disable(); 
   // saving data 

Profiler also has an in-built “Lightweight Sampling” mode. Profiling will be executed every 100 milliseconds after this mode is on. To turn it on start/stop function of profiler should be replaced by xhprof_sample_enable (instead of xhprof_enable), xhprof_sample_disable (instead of xhprof_disable) .

Additional information

The most extensive information about the profiler can be found on its web developers’ page (by the way it’s not just somebody, it’s FaceBook Inc itself).

5 votes, Rating: 5

Read also


Sooner or later every developer comes across the situation when site “goes down” and it must be “got back to life”. The reasons for that may be diverse.


Probably everybody have come across with ready-to-use site packages on Drupal where after installation you get a ready site with the set of necessary modules, personal theme and so on. There are...


Cron.php script is used in Drupal for content indexation, sending e-mails to subscribers, gathering rss-feeds and so on – modules can give task themselves to be done according to schedule.


While developing a real estate site for one of our clients we tried to import...

Need a quote? Let's discuss the project

Are you looking for someone to help you with your Drupal Web Development needs? Let’s get in touch and discuss the requirements of your project. We would love to hear from you.

Join the people who have already subscribed!

Want to be aware of important and interesting things happening? We will inform you about new blog posts on Drupal development, design, QA testing and more, as well news about Drupal events.

No charge. Unsubscribe anytime