Flamboyant Flamegraphs
In this article, I am showing you how to make a flamegraph, a new feature in Xdebug 3.3.
Flamegraphs are an interesting way of showing where an application spends a lot of time.
To show you the functionality, I will be using Xdebug's own website, which I run locally at port 9874.
First of all, we need to configure Xdebug to make our flamegraphs. We do that in a configuration file. With php --ini I find out which file to use:
Configuration File (php.ini) Path: /usr/local/php/8.2dev/lib Loaded Configuration File: /usr/local/php/8.2dev/lib/php.ini Scan for additional .ini files in: /usr/local/php/8.2dev/lib/conf.d Additional .ini files parsed: /usr/local/php/8.2dev/lib/conf.d/20-mongodb.ini, /usr/local/php/8.2dev/lib/conf.d/zzz-xdebug.ini
If you are running Apache or Nginx, I would suggest you use phpinfo() output in the browser to find the same information instead.
I have a specific Xdebug INI file called zzz-xdebug.ini. Its contents are currently:
zend_extension=xdebug.so xdebug.mode=develop,debug
Flamegraphs are part of Xdebug's tracing functionality, which we need to enable by changing the xdebug.mode line to:
xdebug.mode=develop,debug,trace
The tracing functionality supports multiple formats. The flamegraph is number three, so we need to set that as well by adding:
xdebug.trace_format=3
By default, Xdebug Tracer will put files into the /tmp directory, and use a hash of the current working directory to create a trace file name. We want distinct flamegraphs for each URL, so we need to change that by setting:
xdebug.trace_output_name=xdebug.%R
We start all files with trace., and then we use %R to configure to use the URI. Xdebug also supports many other formatting specifiers.
By default, all file names will also be postfixed by .xt.gz.
After making INI changes, you need to restart the web server.
To initiate the tracer, I use an Xdebug Helper browser extension available for Chrome, Firefox, and other browsers.
I click on the debug icon and then on trace:
After requesting the home page, and documentation page, Xdebug's tracer created the following files in the /tmp directory:
derick@gargleblaster:~$ ls -l /tmp/trace.* -rw-r--r-- 1 derick derick 123 Sep 26 03:31 /tmp/trace..05d7ef.xt.gz -rw-r--r-- 1 derick derick 2560 Sep 25 16:55 /tmp/trace._core2_css.xt.gz -rw-r--r-- 1 derick derick 3550 Sep 25 16:55 /tmp/trace._docs_.xt.gz -rw-r--r-- 1 derick derick 2419 Sep 25 16:55 /tmp/trace._fonts_IBMPlexSans-RegularItalic-Latin1_woff2.xt.gz -rw-r--r-- 1 derick derick 2474 Sep 25 16:55 /tmp/trace._images_logos_11com7_svg.xt.gz -rw-r--r-- 1 derick derick 2507 Sep 25 16:55 /tmp/trace._images_logos_io_svg.xt.gz -rw-r--r-- 1 derick derick 2530 Sep 25 16:55 /tmp/trace._images_logos_private-packagist_svg.xt.gz -rw-r--r-- 1 derick derick 2455 Sep 25 16:55 /tmp/trace._images_logos_typo3_svg.xt.gz -rw-r--r-- 1 derick derick 2523 Sep 25 16:55 /tmp/trace._images_logos_xdebug-cloud_svg.xt.gz -rw-r--r-- 1 derick derick 6165 Sep 25 16:55 /tmp/trace._.xt.gz
Because we go through our PHP router process, there are also files for images and fonts.
The important ones are:
-rw-r--r-- 1 derick derick 3550 Sep 25 16:55 /tmp/trace._docs_.xt.gz -rw-r--r-- 1 derick derick 6165 Sep 25 16:55 /tmp/trace._.xt.gz
The contents of these files look like:
{main};require_once;require_once 3046
{main};require_once;ComposerAutoloaderInit7d176ec022516f68e20dcb88554529a8::getLoader;require 7043
{main};require_once;ComposerAutoloaderInit7d176ec022516f68e20dcb88554529a8::getLoader;spl_autoload_register 9408
{main};require_once;ComposerAutoloaderInit7d176ec022516f68e20dcb88554529a8::getLoader;ComposerAutoloaderInit7d176ec022516f68e20dcb88554529a8::loadClassLoader;require 3176
{main};require_once;ComposerAutoloaderInit7d176ec022516f68e20dcb88554529a8::getLoader;ComposerAutoloaderInit7d176ec022516f68e20dcb88554529a8::loadClassLoader 41368
{main};require_once;ComposerAutoloaderInit7d176ec022516f68e20dcb88554529a8::getLoader;dirname 6061
…
In order to create a flame graph, we need to pass this through a Perl script. You can find this script by cloning the flamegraph GIT repository at https://github.com/brendangregg/FlameGraph
Xdebug automatically compresses trace files, which means we need to use zcat as the flamegraph.pl script tool does not understand that. The output needs to be redirected to a file. On one line, we enter:
zcat /tmp/trace._docs_.xt.gz
| ~/dev/brendangreeg-FlameGraph/flamegraph.pl
> /tmp/flame-docs.svg
You can now open this SVG file you can then open in a browser.
The stack shows how deep the code goes, and interestingly, for most of it, you'll see that a lot of time is taken up by Composer, as well as requiring other files.
You can dive in by clicking on specific bits. For example, I'll click on my template default controller:
You can reset the zoom in the top left.
Xdebug's website is not very complex, and for your own code expect to see a lot more complicated flamegraph.
Once you're done, please don't forget to turn off the tracer, as it will fill up your hard drive.
This new flamegraph trace format is new in Xdebug 3.3, out soon.
Life Line
If we must show off a little…
In more info innocent times, the hat riots caused some spankings...
100 Years Ago Men and Boys Fought on the Streets of New York Over Wearing Straw Hats Past Summer | The New York Public Library
https://www.nypl.org/blog/2022/09/23/straw-hat-riots-nycI hiked 15.5km in 3h12m14s
📷 Mushroom Village
🚩 Weg van den Prins Willemsberg, Ellecom, Nederland
I walked 2.4km in 59m34s
📷 National Cycle Network 6
🚩 Watford, United Kingdom
I walked 7.6km in 1h54m50s
📷 Tufted Duck Pair
🚩 Outer Circle, City of Westminster, United Kingdom
RE: https://phpc.social/@Xdebug/115662135830755552
I have just released Xdebug 3.5.0!
In the next few weeks I will create some content (text, and perhaps video) highlighting some new features in more detail.
Please share it with the world!
The master branch is now for Xdebug 3.6, targetting PHP 8.6
Back to -dev
Tweak release instructions a little
Go with 3.5.0
Tweak message IDs and severities for control socket log entries
I walked 8.1km in 1h26m40s
I walked 1.1km in 9m28s
I walked 8.5km in 1h30m56s
My whisky of the month for December 2025, is a 15yo Aultmore bottled by Cadenhead's.
Fixed off-by-one error in address length name for control socket on L…
Merged pull request #1050





Shortlink
This article has a short URL available: https://drck.me/flgrph-i3g