If you find yourself writing any performance sensitive code in PHP, you probably want a profiler to tell you where the slowest parts of your code are. Sometimes you can get by with educated guessing and a few well-placed uses of echo and time, but there really is no substitute for hard data. Luckily, Facebook have written and released a profiler for PHP and it's pretty easy to use.
First off, download and install it. It's
a PECL extension to PHP, so it should install like any
other PECL extension you have. I'm developing on top of
FreeBSD, so I made a port for it. It's not
yet in the ports tree, but if you're running PHP on FreeBSD, you can extract
the port out of the PR I
filed. It's
in the ports tree as
devel/pecl-xhprof.
Once you have it installed, here's how you use it:
<?php
// Start the profiler
//
// XHPROF_FLAGS_MEMORY adds memory usage data, it's quite useful.
// See the docs for further flags.
xhprof_enable(XHPROF_FLAGS_MEMORY);
// Put the bulk of your code here
// Stop the profiler and get the profile data
$profile_data = xhprof_disable();
?>
After you get the profile data you can either save it somewhere and use the
XHProf
UI
provided to browse the data or you can just process the data directly. I'm
working on vBulletin, so I integrated it into the
vBulletin debug output. If you're doing the processing yourself, the following
snippet is useful for converting the inclusive times returned by
xhprof_disable()
to exclusive times.
<?php
require_once('/path/to/xhprof/display/xhprof.php');
$profile_data_totals = array(); // Will contain data for the whole script
$profile_data_exclusive = xhprof_compute_flat_info($profile_data, $profile_data_totals);
?>
That's pretty much it. For anything more than that, refer to the XHProf documentation or have a dig through the XHProf and XHProf UI sources.