Profiling

Profiling PHP scripts is a great way to find out what needs to be done to reduce the required time and memory for a particular process.

Xdebug

To profile PHP script we use xdebug.

Read the full docs on Xdebug profiling here

Enabling

To enable profiling, you need to edit the xdebug config

For example:

The file: /etc/php.d/xdebug.ini should look like:

1
2
3
4
5
6
7
8
zend_extension=/usr/lib64/php/modules/xdebug.so
xdebug.remote_enable=1
xdebug.max_nesting_level = 2000
xdebug.file_link_format="phpstorm://open?file=/var/lib/lxc/ballicom-akeneo/rootfs/%f&line=%l"

xdebug.profiler_enable=1
xdebug.profiler_output_dir=/tmp
xdebug.profiler_output_name=xdebug.cachegrind.out.%p

Once you have it enabled, you need to make sure you also restart php-fpm if you want to profile web requests: systemctl restart php-fpm

Warning

Do not leave profiling enabled. It can generate a large number of huge files very quickly.

Generating

To generate your profile, simply run the command line script you are profiling, or hit the web page you want to profile.

Each run will generate a standalone profile. Based on the above config, the file will be in /tmp and will be called something like xdebug.cachegrind.out.123

To double check the file has been created, you can run ll /tmp/xdebug*. If this is a long running process, you should see the size of the file increasing.

Tip

As soon as you have your profile, it is sensible to immediately go and disable profiling

Examining

Once you have generated the profile, the next thing to do is view it so that you can see what is going on.

kcachegrind

To do this you need to install kcachegrind

1
sudo dnf -y install kcachegrind

Then you can open your generated file, for example

1
kcachegrind /var/lib/lxc/ec-akeneo/rootfs/tmp/xdebug.cachegrind.out.3857

If your profile is very big then this might take a while to load up, so be patient

webgrind

Alternatively to kcachegrind, there is a pure PHP solution called webgrind which provides a different visualisation and you might find it easier.

On the other hand, it only seems to support legacy PHP versions.#

Note

This solution has not yet been tested. Please update this documentation and remove this notice once we have confirmed it is a good solution

PHP SPX

Alternatively to Xdebug, there is a PHP extension called SPX, which stands for Simple Profiling eXtension

This solution can easily provide instantaneous feedback, especially on CLI scripts.

It can also create callgrind files which can then be viewed in kcachegrind as with Xdebug.

Note

This solution has not yet been tested. Please update this documentation and remove this notice once we have confirmed it is a good solution