8000 Merged some profiler docs into a single main Profiler article by javiereguiluz · Pull Request #10970 · symfony/symfony-docs · GitHub
[go: up one dir, main page]

Skip to content

Merged some profiler docs into a single main Profiler article #10970

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Merged some profiler docs into a single main Profiler article
  • Loading branch information
javiereguiluz committed Feb 7, 2019
commit f28fe4e6b40d17f208ab0ffefbcad3815930b89f
3 changes: 3 additions & 0 deletions _build/redirection_map
Original file line number Diff line number Diff line change
Expand Up @@ -405,3 +405,6 @@
/console/logging /console
/reference/forms/twig_reference /form/form_customization
/form/rendering /form/form_customization
/profiler/matchers /profiler
/profiler/profiling_data /profiler
/profiler/wdt_follow_ajax /profiler
Binary file added _images/profiler/web-interface.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
179 changes: 171 additions & 8 deletions profiler.rst
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,8 @@ Profiler
========

The profiler is a powerful **development tool** that gives detailed information
about the execution of any request.

**Never** enable the profiler in production environments as it will lead to
major security vulnerabilities in your project.
about the execution of any request. **Never** enable the profiler in production
environments as it will lead to major security vulnerabilities in your project.

Installation
------------
Expand All @@ -17,10 +15,175 @@ install the profiler before using it:

$ composer require --dev symfony/profiler-pack

Now browse any page of your application in the development environment to let
the profiler collect information. Then, click on any element of the debug
toolbar injected at the bottom of your pages to open the web interface of the
Symfony Profiler, which will look like this:

.. image:: /_images/profiler/web-interface.png
:align: center

Accessing Profiling Data Programmatically
-----------------------------------------

Most of the times, the profiler information is accessed and analyzed using its
web-based interface. However, you can also retrieve profiling information
programmatically thanks to the methods provided by the ``profiler`` service.

When the response object is available, use the
:method:`Symfony\\Component\\HttpKernel\\Profiler\\Profiler::loadProfileFromResponse`
method to access to its associated profile::

// ... $profiler is the 'profiler' service
$profile = $profiler->loadProfileFromResponse($response);

When the profiler stores data about a request, it also associates a token with it;
this token is available in the ``X-Debug-Token`` HTTP header of the response.
Using this token, you can access the profile of any past response thanks to the
:method:`Symfony\\Component\\HttpKernel\\Profiler\\Profiler::loadProfile` method::

$token = $response->headers->get('X-Debug-Token');
$profile = $profiler->loadProfile($token);

.. tip::

When the profiler is enabled but not the web debug toolbar, inspect the page
with your browser's developer tools to get the value of the ``X-Debug-Token``
HTTP header.

The ``profiler`` service also provides the
:method:`Symfony\\Component\\HttpKernel\\Profiler\\Profiler::find` method to
look for tokens based on some criteria::

// gets the latest 10 tokens
$tokens = $profiler->find('', '', 10, '', '', '');

// gets the latest 10 tokens for all URL containing /admin/
$tokens = $profiler->find('', '/admin/', 10, '', '', '');

// gets the latest 10 tokens for local POST requests
$tokens = $profiler->find('127.0.0.1', '', 10, 'POST', '', '');

// gets the latest 10 tokens for requests that happened between 2 and 4 days ago
$tokens = $profiler->find('', '', 10, '', '4 days ago', '2 days ago');

Data Collectors
---------------

The profiler gets its information using some services called "data collectors".
Symfony comes with several collectors that get information about the request,
the logger, the routing, the cache, etc.

Run this command to get the list of collectors actually enabled in your app:

.. code-block:: terminal

$ php bin/console debug:container --tag=data_collector

You can also :doc:`create your own data collector </profiler/data_collector>` to
store any data generated by your app and display it in the debug toolbar and the
profiler web interface.

Enabling the Profiler Conditionally
-----------------------------------

.. caution::

The possibility to use a matcher to enable the profiler conditionally was
removed in Symfony 4.0.

Symfony Profiler cannot be enabled/disabled conditionally using matchers, because
that feature was removed in Symfony 4.0. However, you can use the ``enable()``
and ``disable()`` methods of the :class:`Symfony\\Component\\HttpKernel\\Profiler\\Profiler`
class in your controllers to manage the profiler programmatically::

use Symfony\Component\HttpKernel\Profiler\Profiler;
// ...

class DefaultController
{
// ...

public function someMethod(?Profiler $profiler)
{
// $profiler won't be set if your environment doesn't have the profiler (like prod, by default)
if (null !== $profiler) {
// if it exists, disable the profiler for this particular controller action
$profiler->disable();
}

// ...
}
}

In order for the profiler to be injected into your controller you need to
create an alias pointing to the existing ``profiler`` service:

.. configuration-block::

.. code-block:: yaml

# config/services_dev.yaml
services:
Symfony\Component\HttpKernel\Profiler\Profiler: '@profiler'

.. code-block:: xml

<!-- config/services_dev.xml -->
<?xml version="1.0" encoding="UTF-8" ?>
<container xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/services
http://symfony.com/schema/dic/services/services-1.0.xsd">

<services>
<service id="Symfony\Component\HttpKernel\Profiler\Profiler" alias="profiler" />
</services>
</container>

.. code-block:: php

// config/services_dev.php
use Symfony\Component\HttpKernel\Profiler\Profiler;

$container->setAlias(Profiler::class, 'profiler');

Updating the Web Debug Toolbar After AJAX Requests
--------------------------------------------------

`Single-page applications`_ (SPA) are web applications that interact with the
user by dynamically rewriting the current page rather than loading entire new
pages from a server.

By default, the debug toolbar displays the information of the initial page load
and doesn't refresh after each AJAX request. However, you can set the
``Symfony-Debug-Toolbar-Replace`` header to a value of ``1`` in the response to
the AJAX request to force the refresh of the toolbar::

$response->headers->set('Symfony-Debug-Toolbar-Replace', 1);

Ideally this header should only be set during development and not for
production. To do that, create an :doc:`event subscriber </event_dispatcher>`
and listen to the :ref:`kernel.response<component-http-kernel-kernel-response>`
event::

use Symfony\Component\HttpKernel\Event\FilterResponseEvent;

// ...

public function onKernelResponse(FilterResponseEvent $event)
{
if (!$this->getKernel()->isDebug()) {
return;
}

$response = $event->getResponse();
$response->headers->set('Symfony-Debug-Toolbar-Replace', 1);
}

.. toctree::
:maxdepth: 1
:hidden:

profiler/data_collector
profiler/profiling_data
profiler/matchers
profiler/wdt_follow_ajax

.. _`Single-page applications`: https://en.wikipedia.org/wiki/Single-page_application
66 changes: 0 additions & 66 deletions profiler/matchers.rst

This file was deleted.

46 changes: 0 additions & 46 deletions profiler/profiling_data.rst

This file was deleted.

45 changes: 0 additions & 45 deletions profiler/wdt_follow_ajax.rst

This file was deleted.

0