@@ -2,10 +2,8 @@ Profiler
2
2
========
3
3
4
4
The profiler is a powerful **development tool ** that gives detailed information
5
- about the execution of any request.
6
-
7
- **Never ** enable the profiler in production environments as it will lead to
8
- major security vulnerabilities in your project.
5
+ about the execution of any request. **Never ** enable the profiler in production
6
+ environments as it will lead to major security vulnerabilities in your project.
9
7
10
8
Installation
11
9
------------
@@ -17,10 +15,175 @@ install the profiler before using it:
17
15
18
16
$ composer require --dev symfony/profiler-pack
19
17
18
+ Now browse any page of your application in the development environment to let
19
+ the profiler collect information. Then, click on any element of the debug
20
+ toolbar injected at the bottom of your pages to open the web interface of the
21
+ Symfony Profiler, which will look like this:
22
+
23
+ .. image :: /_images/profiler/web-interface.png
24
+ :align: center
25
+
26
+ Accessing Profiling Data Programmatically
27
+ -----------------------------------------
28
+
29
+ Most of the times, the profiler information is accessed and analyzed using its
30
+ web-based interface. However, you can also retrieve profiling information
31
+ programmatically thanks to the methods provided by the ``profiler `` service.
32
+
33
+ When the response object is available, use the
34
+ :method: `Symfony\\ Component\\ HttpKernel\\ Profiler\\ Profiler::loadProfileFromResponse `
35
+ method to access to its associated profile::
36
+
37
+ // ... $profiler is the 'profiler' service
38
+ $profile = $profiler->loadProfileFromResponse($response);
39
+
40
+ When the profiler stores data about a request, it also associates a token with it;
41
+ this token is available in the ``X-Debug-Token `` HTTP header of the response.
42
+ Using this token, you can access the profile of any past response thanks to the
43
+ :method: `Symfony\\ Component\\ HttpKernel\\ Profiler\\ Profiler::loadProfile ` method::
44
+
45
+ $token = $response->headers->get('X-Debug-Token');
46
+ $profile = $profiler->loadProfile($token);
47
+
48
+ .. tip ::
49
+
50
+ When the profiler is enabled but not the web debug toolbar, inspect the page
51
+ with your browser's developer tools to get the value of the ``X-Debug-Token ``
52
+ HTTP header.
53
+
54
+ The ``profiler `` service also provides the
55
+ :method: `Symfony\\ Component\\ HttpKernel\\ Profiler\\ Profiler::find ` method to
56
+ look for tokens based on some criteria::
57
+
58
+ // gets the latest 10 tokens
59
+ $tokens = $profiler->find('', '', 10, '', '', '');
60
+
61
+ // gets the latest 10 tokens for all URL containing /admin/
62
+ $tokens = $profiler->find('', '/admin/', 10, '', '', '');
63
+
64
+ // gets the latest 10 tokens for local POST requests
65
+ $tokens = $profiler->find('127.0.0.1', '', 10, 'POST', '', '');
66
+
67
+ // gets the latest 10 tokens for requests that happened between 2 and 4 days ago
68
+ $tokens = $profiler->find('', '', 10, '', '4 days ago', '2 days ago');
69
+
70
+ Data Collectors
71
+ ---------------
72
+
73
+ The profiler gets its information using some services called "data collectors".
74
+ Symfony comes with several collectors that get information about the request,
75
+ the logger, the routing, the cache, etc.
76
+
77
+ Run this command to get the list of collectors actually enabled in your app:
78
+
79
+ .. code-block :: terminal
80
+
81
+ $ php bin/console debug:container --tag=data_collector
82
+
83
+ You can also :doc: `create your own data collector </profiler/data_collector >` to
84
+ store any data generated by your app and display it in the debug toolbar and the
85
+ profiler web interface.
86
+
87
+ Enabling the Profiler Conditionally
88
+ -----------------------------------
89
+
90
+ .. caution ::
91
+
92
+ The possibility to use a matcher to enable the profiler conditionally was
93
+ removed in Symfony 4.0.
94
+
95
+ Symfony Profiler cannot be enabled/disabled conditionally using matchers, because
96
+ that feature was removed in Symfony 4.0. However, you can use the ``enable() ``
97
+ and ``disable() `` methods of the :class: `Symfony\\ Component\\ HttpKernel\\ Profiler\\ Profiler `
98
+ class in your controllers to manage the profiler programmatically::
99
+
100
+ use Symfony\Component\HttpKernel\Profiler\Profiler;
10
F438
1
+ // ...
102
+
103
+ class DefaultController
104
+ {
105
+ // ...
106
+
107
+ public function someMethod(?Profiler $profiler)
108
+ {
109
+ // $profiler won't be set if your environment doesn't have the profiler (like prod, by default)
110
+ if (null !== $profiler) {
111
+ // if it exists, disable the profiler for this particular controller action
112
+ $profiler->disable();
113
+ }
114
+
115
+ // ...
116
+ }
117
+ }
118
+
119
+ In order for the profiler to be injected into your controller you need to
120
+ create an alias pointing to the existing ``profiler `` service:
121
+
122
+ .. configuration-block ::
123
+
124
+ .. code-block :: yaml
125
+
126
+ # config/services_dev.yaml
127
+ services :
128
+ Symfony\Component\HttpKernel\Profiler\Profiler : ' @profiler'
129
+
130
+ .. code-block :: xml
131
+
132
+ <!-- config/services_dev.xml -->
133
+ <?xml version =" 1.0" encoding =" UTF-8" ?>
134
+ <container xmlns =" http://symfony.com/schema/dic/services"
135
+ xmlns : xsi =" http://www.w3.org/2001/XMLSchema-instance"
136
+ xsi : schemaLocation =" http://symfony.com/schema/dic/services
137
+ http://symfony.com/schema/dic/services/services-1.0.xsd" >
138
+
139
+ <services >
140
+ <service id =" Symfony\Component\HttpKernel\Profiler\Profiler" alias =" profiler" />
141
+ </services >
142
+ </container >
143
+
144
+ .. code-block :: php
145
+
146
+ // config/services_dev.php
147
+ use Symfony\Component\HttpKernel\Profiler\Profiler;
148
+
149
+ $container->setAlias(Profiler::class, 'profiler');
150
+
151
+ Updating the Web Debug Toolbar After AJAX Requests
152
+ --------------------------------------------------
153
+
154
+ `Single-page applications `_ (SPA) are web applications that interact with the
155
+ user by dynamically rewriting the current page rather than loading entire new
156
+ pages from a server.
157
+
158
+ By default, the debug toolbar displays the information of the initial page load
159
+ and doesn't refresh after each AJAX request. However, you can set the
160
+ ``Symfony-Debug-Toolbar-Replace `` header to a value of ``1 `` in the response to
161
+ the AJAX request to force the refresh of the toolbar::
162
+
163
+ $response->headers->set('Symfony-Debug-Toolbar-Replace', 1);
164
+
165
+ Ideally this header should only be set during development and not for
166
+ production. To do that, create an :doc: `event subscriber </event_dispatcher >`
167
+ and listen to the :ref: `kernel.response<component-http-kernel-kernel-response> `
168
+ event::
169
+
170
+ use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
171
+
172
+ // ...
173
+
174
+ public function onKernelResponse(FilterResponseEvent $event)
175
+ {
176
+ if (!$this->getKernel()->isDebug()) {
177
+ return;
178
+ }
179
+
180
+ $response = $event->getResponse();
181
+ $response->headers->set('Symfony-Debug-Toolbar-Replace', 1);
182
+ }
183
+
20
184
.. toctree ::
21
- :maxdepth: 1
185
+ :hidden:
22
186
23
187
profiler/data_collector
24
- profiler/profiling_data
25
- profiler/matchers
26
- profiler/wdt_follow_ajax
188
+
189
+ .. _`Single-page applications` : https://en.wikipedia.org/wiki/Single-page_application
0 commit comments