Profiling HTTP Requests

Blackfire main use case is to profile HTTP requests like web pages, web service calls, or API calls.

Before starting profiling, check that you have Blackfire installed correctly on the server hosting the website you need to profile.

Profiling an HTTP request mean instrumenting the project's code, which incurs some overhead. Blackfire is apart from many other profilers because of two main differences:

  • Blackfire automatically instruments your code when needed, so you don't need to change your code;
  • Blackfire does nothing when you are not profiling a request (the overhead is then almost zero), so it is safe to deploy Blackfire on production servers, even for heavy-traffic projects.

You can profile HTTP requests from Google Chrome. This cookbook describes how to profile from the command line interface.

Profiling Simple HTTP Requests

Profiling an HTTP request can be done on the command line thanks to the blackfire utility that is bundled with the Blackfire Agent.

The easiest way to profile an HTTP request is to use the curl sub-command of the blackfire utility. It accepts the same arguments and options as the regular curl utility:

blackfire curl

You can get a list of options available for the curl sub-command:

blackfire help curl

To get more accurate results, take several samples of the request via the --samples option (we recommend you to use this option only for "safe" HTTP requests like GET requests):

blackfire --samples 10 curl

At the end, blackfire outputs the URL where the profile can be found (this can be hidden by passing the -q option.)

Note that you need curl to be installed on your system for blackfire curl to work. If curl is not available or if you prefer to use another tool to make your HTTP requests, use the run sub-command instead:

blackfire run sh -c 'curl -H "X-Blackfire-Query: $BLACKFIRE_QUERY" > /dev/null'

blackfire run sh -c 'wget --header="X-Blackfire-Query: $BLACKFIRE_QUERY" > /dev/null'

As you can see, you need to add a custom X-Blackfire-Query HTTP header to trigger the profiling; the value is the content of the $BLACKFIRE_QUERY environment variable, which is automatically set by the blackfire utility. It means that this method works for any tools that accept custom HTTP headers.

JSON Output

You can integrate Blackfire results into your own tools by using the --json option to get a JSON representation of a profile:

blackfire --json curl

The resources consumed are available under the envelope entry; keys are the cost dimensions:

  • pmu: Peak Memory Usage (in bytes);
  • nw: Network (in bytes);
  • wt: Wall Clock Time (in microseconds);
  • cpu: CPU time (in microseconds);
  • io: I/O time (in microseconds).

Profiling non-GET Requests, Ajax, and More

Profiling non-GET requests or requests which need some specific HTTP headers is no different as blackfire curl supports all cURL options:

blackfire curl -XPOST

Did you know that browsers like Firefox or Google Chrome can give you the cURL arguments and options to use for any web page like Ajax calls? It's known as "copy-as-cUrl" in both browsers:


Profiling Part of an HTTP Call

Blackfire automatically instruments your code, but sometimes, you might want to focus the profiling on only part of the code. That's possible when opting for manual instrumentation via the PHP SDK.

After instrumenting your code, use the blackfire utility as above to profile your application. When not using Blackfire, all calls are converted to noops.

Profiling all Requests While you Browse


This feature is only available to Profiler, Premium and Enterprise users.

Profiling POST requests, Ajax requests, and API calls can be done via the "Profile all Requests" link in the browser Companion.

When profiling from a browser, select "Profile all requests", then "Record!". Blackfire will instrument all requests until you click on the "Stop" button in the pop-over.

A pop-over window will open at the bottom right of your screen, where all profiled requests will be listed.

All PHP requests which have been profiled will be shown on your dashboard.