comparison vendor/symfony/http-kernel/Profiler/Profiler.php @ 0:4c8ae668cc8c

Initial import (non-working)
author Chris Cannam
date Wed, 29 Nov 2017 16:09:58 +0000
parents
children 1fec387a4317
comparison
equal deleted inserted replaced
-1:000000000000 0:4c8ae668cc8c
1 <?php
2
3 /*
4 * This file is part of the Symfony package.
5 *
6 * (c) Fabien Potencier <fabien@symfony.com>
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12 namespace Symfony\Component\HttpKernel\Profiler;
13
14 use Symfony\Component\HttpFoundation\Exception\ConflictingHeadersException;
15 use Symfony\Component\HttpFoundation\Request;
16 use Symfony\Component\HttpFoundation\Response;
17 use Symfony\Component\HttpKernel\DataCollector\DataCollectorInterface;
18 use Symfony\Component\HttpKernel\DataCollector\LateDataCollectorInterface;
19 use Psr\Log\LoggerInterface;
20
21 /**
22 * Profiler.
23 *
24 * @author Fabien Potencier <fabien@symfony.com>
25 */
26 class Profiler
27 {
28 /**
29 * @var ProfilerStorageInterface
30 */
31 private $storage;
32
33 /**
34 * @var DataCollectorInterface[]
35 */
36 private $collectors = array();
37
38 /**
39 * @var LoggerInterface
40 */
41 private $logger;
42
43 /**
44 * @var bool
45 */
46 private $enabled = true;
47
48 /**
49 * Constructor.
50 *
51 * @param ProfilerStorageInterface $storage A ProfilerStorageInterface instance
52 * @param LoggerInterface $logger A LoggerInterface instance
53 */
54 public function __construct(ProfilerStorageInterface $storage, LoggerInterface $logger = null)
55 {
56 $this->storage = $storage;
57 $this->logger = $logger;
58 }
59
60 /**
61 * Disables the profiler.
62 */
63 public function disable()
64 {
65 $this->enabled = false;
66 }
67
68 /**
69 * Enables the profiler.
70 */
71 public function enable()
72 {
73 $this->enabled = true;
74 }
75
76 /**
77 * Loads the Profile for the given Response.
78 *
79 * @param Response $response A Response instance
80 *
81 * @return Profile|false A Profile instance
82 */
83 public function loadProfileFromResponse(Response $response)
84 {
85 if (!$token = $response->headers->get('X-Debug-Token')) {
86 return false;
87 }
88
89 return $this->loadProfile($token);
90 }
91
92 /**
93 * Loads the Profile for the given token.
94 *
95 * @param string $token A token
96 *
97 * @return Profile A Profile instance
98 */
99 public function loadProfile($token)
100 {
101 return $this->storage->read($token);
102 }
103
104 /**
105 * Saves a Profile.
106 *
107 * @param Profile $profile A Profile instance
108 *
109 * @return bool
110 */
111 public function saveProfile(Profile $profile)
112 {
113 // late collect
114 foreach ($profile->getCollectors() as $collector) {
115 if ($collector instanceof LateDataCollectorInterface) {
116 $collector->lateCollect();
117 }
118 }
119
120 if (!($ret = $this->storage->write($profile)) && null !== $this->logger) {
121 $this->logger->warning('Unable to store the profiler information.', array('configured_storage' => get_class($this->storage)));
122 }
123
124 return $ret;
125 }
126
127 /**
128 * Purges all data from the storage.
129 */
130 public function purge()
131 {
132 $this->storage->purge();
133 }
134
135 /**
136 * Finds profiler tokens for the given criteria.
137 *
138 * @param string $ip The IP
139 * @param string $url The URL
140 * @param string $limit The maximum number of tokens to return
141 * @param string $method The request method
142 * @param string $start The start date to search from
143 * @param string $end The end date to search to
144 * @param string $statusCode The request status code
145 *
146 * @return array An array of tokens
147 *
148 * @see http://php.net/manual/en/datetime.formats.php for the supported date/time formats
149 */
150 public function find($ip, $url, $limit, $method, $start, $end, $statusCode = null)
151 {
152 return $this->storage->find($ip, $url, $limit, $method, $this->getTimestamp($start), $this->getTimestamp($end), $statusCode);
153 }
154
155 /**
156 * Collects data for the given Response.
157 *
158 * @param Request $request A Request instance
159 * @param Response $response A Response instance
160 * @param \Exception $exception An exception instance if the request threw one
161 *
162 * @return Profile|null A Profile instance or null if the profiler is disabled
163 */
164 public function collect(Request $request, Response $response, \Exception $exception = null)
165 {
166 if (false === $this->enabled) {
167 return;
168 }
169
170 $profile = new Profile(substr(hash('sha256', uniqid(mt_rand(), true)), 0, 6));
171 $profile->setTime(time());
172 $profile->setUrl($request->getUri());
173 $profile->setMethod($request->getMethod());
174 $profile->setStatusCode($response->getStatusCode());
175 try {
176 $profile->setIp($request->getClientIp());
177 } catch (ConflictingHeadersException $e) {
178 $profile->setIp('Unknown');
179 }
180
181 $response->headers->set('X-Debug-Token', $profile->getToken());
182
183 foreach ($this->collectors as $collector) {
184 $collector->collect($request, $response, $exception);
185
186 // we need to clone for sub-requests
187 $profile->addCollector(clone $collector);
188 }
189
190 return $profile;
191 }
192
193 /**
194 * Gets the Collectors associated with this profiler.
195 *
196 * @return array An array of collectors
197 */
198 public function all()
199 {
200 return $this->collectors;
201 }
202
203 /**
204 * Sets the Collectors associated with this profiler.
205 *
206 * @param DataCollectorInterface[] $collectors An array of collectors
207 */
208 public function set(array $collectors = array())
209 {
210 $this->collectors = array();
211 foreach ($collectors as $collector) {
212 $this->add($collector);
213 }
214 }
215
216 /**
217 * Adds a Collector.
218 *
219 * @param DataCollectorInterface $collector A DataCollectorInterface instance
220 */
221 public function add(DataCollectorInterface $collector)
222 {
223 $this->collectors[$collector->getName()] = $collector;
224 }
225
226 /**
227 * Returns true if a Collector for the given name exists.
228 *
229 * @param string $name A collector name
230 *
231 * @return bool
232 */
233 public function has($name)
234 {
235 return isset($this->collectors[$name]);
236 }
237
238 /**
239 * Gets a Collector by name.
240 *
241 * @param string $name A collector name
242 *
243 * @return DataCollectorInterface A DataCollectorInterface instance
244 *
245 * @throws \InvalidArgumentException if the collector does not exist
246 */
247 public function get($name)
248 {
249 if (!isset($this->collectors[$name])) {
250 throw new \InvalidArgumentException(sprintf('Collector "%s" does not exist.', $name));
251 }
252
253 return $this->collectors[$name];
254 }
255
256 private function getTimestamp($value)
257 {
258 if (null === $value || '' == $value) {
259 return;
260 }
261
262 try {
263 $value = new \DateTime(is_numeric($value) ? '@'.$value : $value);
264 } catch (\Exception $e) {
265 return;
266 }
267
268 return $value->getTimestamp();
269 }
270 }