@@ -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,207 @@ 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
+ :class: with-browser
26
+
27
+ Accessing Profiling Data Programmatically
28
+ -----------------------------------------
29
+
30
+ Most of the times, the profiler information is accessed and analyzed using its
31
+ web-based interface. However, you can also retrieve profiling information
32
+ programmatically thanks to the methods provided by the ``profiler `` service.
33
+
34
+ When the response object is available, use the
35
+ :method: `Symfony\\ Component\\ HttpKernel\\ Profiler\\ Profiler::loadProfileFromResponse `
36
+ method to access to its associated profile::
37
+
38
+ // ... $profiler is the 'profiler' service
39
+ $profile = $profiler->loadProfileFromResponse($response);
40
+
41
+ When the profiler stores data about a request, it also associates a token with it;
42
+ this token is available in the ``X-Debug-Token `` HTTP header of the response.
43
+ Using this token, you can access the profile of any past response thanks to the
44
+ :method: `Symfony\\ Component\\ HttpKernel\\ Profiler\\ Profiler::loadProfile ` method::
45
+
46
+ $token = $response->headers->get('X-Debug-Token');
47
+ $profile = $profiler->loadProfile($token);
48
+
49
+ .. tip ::
50
+
51
+ When the profiler is enabled but not the web debug toolbar, inspect the page
52
+ with your browser's developer tools to get the value of the ``X-Debug-Token ``
53
+ HTTP header.
54
+
55
+ The ``profiler `` service also provides the
56
+ :method: `Symfony\\ Component\\ HttpKernel\\ Profiler\\ Profiler::find ` method to
57
+ look for tokens based on some criteria::
58
+
59
+ // gets the latest 10 tokens
60
+ $tokens = $profiler->find('', '', 10, '', '', '');
61
+
62
+ // gets the latest 10 tokens for all URL containing /admin/
63
+ $tokens = $profiler->find('', '/admin/', 10, '', '', '');
64
+
65
+ // gets the latest 10 tokens for local POST requests
66
+ $tokens = $profiler->find('127.0.0.1', '', 10, 'POST', '', '');
67
+
68
+ // gets the latest 10 tokens for requests that happened between 2 and 4 days ago
69
+ $tokens = $profiler->find('', '', 10, '', '4 days ago', '2 days ago');
70
+
71
+ Data Collectors
72
+ ---------------
73
+
74
+ The profiler gets its information using some services called "data collectors".
75
+ Symfony comes with several collectors that get information about the request,
76
+ the logger, the routing, the cache, etc.
77
+
78
+ Run this command to get the list of collectors actually enabled in your app:
79
+
80
+ .. code-block :: terminal
81
+
82
+ $ php bin/console debug:container --tag=data_collector
83
+
84
+ You can also :doc: `create your own data collector </profiler/data_collector >` to
85
+ store any data generated by your app and display it in the debug toolbar and the
86
+ profiler web interface.
87
+
88
+ .. _profiler-timing-execution :
89
+
90
+ Timing the Execution of the Application
91
+ ---------------------------------------
92
+
93
+ If you want to measure the time some tasks take in your application, there's no
94
+ need to create a custom data collector. Instead, use the `Stopwatch component `_
95
+ which provides utilities to profile code and displayes the results on the
96
+ "Performance" panel of the Profiler web interface.
97
+
98
+ When using :ref: `autowiring <services-autowire >`, type-hint any argument with
99
+ the :class: `Symfony\\ Component\\ Stopwatch\\ Stopwatch ` class and Symfony will
100
+ inject the Stopwatch service. Then, use the ``start() ``, ``lapse() `` and
101
+ ``stop() `` methods to measure time::
102
+
103
+ // a user signs up and the timer starts...
104
+ $stopwatch->start('user-sign-up');
105
+
106
+ // ...do things to sign up the user...
107
+ $stopwatch->lapse('user-sign-up');
108
+
109
+ // ...the sign up process is finished
110
+ $stopwatch->stop('user-sign-up');
111
+
112
+ .. tip ::
113
+
114
+ Consider using a professional profiler such as `Blackfire `_ to measure and
115
+ analyze the execution of your application in detail.
116
+
117
+ Enabling the Profiler Conditionally
118
+ -----------------------------------
119
+
120
+ .. caution ::
121
+
122
+ The possibility to use a matcher to enable the profiler conditionally was
123
+ removed in Symfony 4.0.
124
+
125
+ Symfony Profiler cannot be enabled/disabled conditionally using matchers, because
126
+ that feature was removed in Symfony 4.0. However, you can use the ``enable() ``
127
+ and ``disable() `` methods of the :class: `Symfony\\ Component\\ HttpKernel\\ Profiler\\ Profiler `
128
+ class in your controllers to manage the profiler programmatically::
129
+
130
+ use Symfony\Component\HttpKernel\Profiler\Profiler;
131
+ // ...
132
+
133
+ class DefaultController
134
+ {
135
+ // ...
136
+
137
+ public function someMethod(?Profiler $profiler)
138
+ {
139
+ // $profiler won't be set if your environment doesn't have the profiler (like prod, by default)
140
+ if (null !== $profiler) {
141
+ // if it exists, disable the profiler for this particular controller action
142
+ $profiler->disable();
143
+ }
144
+
145
+ // ...
146
+ }
147
+ }
148
+
149
+ In order for the profiler to be injected into your controller you need to
150
+ create an alias pointing to the existing ``profiler `` service:
151
+
152
+ .. configuration-block ::
153
+
154
+ .. code-block :: yaml
155
+
156
+ # config/services_dev.yaml
157
+ services :
158
+ Symfony\Component\HttpKernel\Profiler\Profiler : ' @profiler'
159
+
160
+ .. code-block :: xml
161
+
162
+ <!-- config/services_dev.xml -->
163
+ <?xml version =" 1.0" encoding =" UTF-8" ?>
164
+ <container xmlns =" http://symfony.com/schema/dic/services"
165
+ xmlns : xsi =" http://www.w3.org/2001/XMLSchema-instance"
166
+ xsi : schemaLocation =" http://symfony.com/schema/dic/services
167
+ http://symfony.com/schema/dic/services/services-1.0.xsd" >
168
+
169
+ <services >
170
+ <service id =" Symfony\Component\HttpKernel\Profiler\Profiler" alias =" profiler" />
171
+ </services >
172
+ </container >
173
+
174
+ .. code-block :: php
175
+
176
+ // config/services_dev.php
177
+ use Symfony\Component\HttpKernel\Profiler\Profiler;
178
+
179
+ $container->setAlias(Profiler::class, 'profiler');
180
+
181
+ Updating the Web Debug Toolbar After AJAX Requests
182
+ --------------------------------------------------
183
+
184
+ `Single-page applications `_ (SPA) are web applications that interact with the
185
+ user by dynamically rewriting the current page rather than loading entire new
186
+ pages from a server.
187
+
188
+ By default, the debug toolbar displays the information of the initial page load
189
+ and doesn't refresh after each AJAX request. However, you can set the
190
+ ``Symfony-Debug-Toolbar-Replace `` header to a value of ``1 `` in the response to
191
+ the AJAX request to force the refresh of the toolbar::
192
+
193
+ $response->headers->set('Symfony-Debug-Toolbar-Replace', 1);
194
+
195
+ Ideally this header should only be set during development and not for
196
+ production. To do that, create an :doc: `event subscriber </event_dispatcher >`
197
+ and listen to the :ref: `kernel.response<component-http-kernel-kernel-response> `
198
+ event::
199
+
200
+ use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
201
+
202
+ // ...
203
+
204
+ public function onKernelResponse(FilterResponseEvent $event)
205
+ {
206
+ if (!$this->getKernel()->isDebug()) {
207
+ return;
208
+ }
209
+
210
+ $response = $event->getResponse();
211
+ $response->headers->set('Symfony-Debug-Toolbar-Replace', 1);
212
+ }
213
+
20
214
.. toctree ::
21
- :maxdepth: 1
215
+ :hidden:
22
216
23
217
profiler/data_collector
24
- profiler/profiling_data
25
- profiler/matchers
26
- profiler/wdt_follow_ajax
218
+
219
+ .. _`Single-page applications` : https://en.wikipedia.org/wiki/Single-page_application
220
+ .. _`Stopwatch component` : https://symfony.com/components/Stopwatch
221
+ .. _`Blackfire` : https://blackfire.io/
0 commit comments