* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpKernel\EventListener; use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent; use Symfony\Component\HttpKernel\Event\FilterResponseEvent; use Symfony\Component\HttpKernel\Event\PostResponseEvent; use Symfony\Component\HttpKernel\KernelEvents; use Symfony\Component\HttpKernel\Profiler\Profiler; use Symfony\Component\HttpFoundation\RequestMatcherInterface; use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Component\EventDispatcher\EventSubscriberInterface; /** * ProfilerListener collects data for the current request by listening to the kernel events. * * @author Fabien Potencier */ class ProfilerListener implements EventSubscriberInterface { protected $profiler; protected $matcher; protected $onlyException; protected $onlyMasterRequests; protected $exception; protected $profiles; protected $requestStack; protected $parents; /** * @param Profiler $profiler A Profiler instance * @param RequestStack $requestStack A RequestStack instance * @param RequestMatcherInterface|null $matcher A RequestMatcher instance * @param bool $onlyException True if the profiler only collects data when an exception occurs, false otherwise * @param bool $onlyMasterRequests True if the profiler only collects data when the request is a master request, false otherwise */ public function __construct(Profiler $profiler, RequestStack $requestStack, RequestMatcherInterface $matcher = null, $onlyException = false, $onlyMasterRequests = false) { $this->profiler = $profiler; $this->matcher = $matcher; $this->onlyException = (bool) $onlyException; $this->onlyMasterRequests = (bool) $onlyMasterRequests; $this->profiles = new \SplObjectStorage(); $this->parents = new \SplObjectStorage(); $this->requestStack = $requestStack; } /** * Handles the onKernelException event. */ public function onKernelException(GetResponseForExceptionEvent $event) { if ($this->onlyMasterRequests && !$event->isMasterRequest()) { return; } $this->exception = $event->getException(); } /** * Handles the onKernelResponse event. */ public function onKernelResponse(FilterResponseEvent $event) { $master = $event->isMasterRequest(); if ($this->onlyMasterRequests && !$master) { return; } if ($this->onlyException && null === $this->exception) { return; } $request = $event->getRequest(); $exception = $this->exception; $this->exception = null; if (null !== $this->matcher && !$this->matcher->matches($request)) { return; } if (!$profile = $this->profiler->collect($request, $event->getResponse(), $exception)) { return; } $this->profiles[$request] = $profile; $this->parents[$request] = $this->requestStack->getParentRequest(); } public function onKernelTerminate(PostResponseEvent $event) { // attach children to parents foreach ($this->profiles as $request) { if (null !== $parentRequest = $this->parents[$request]) { if (isset($this->profiles[$parentRequest])) { $this->profiles[$parentRequest]->addChild($this->profiles[$request]); } } } // save profiles foreach ($this->profiles as $request) { $this->profiler->saveProfile($this->profiles[$request]); } $this->profiles = new \SplObjectStorage(); $this->parents = new \SplObjectStorage(); } public static function getSubscribedEvents() { return array( KernelEvents::RESPONSE => array('onKernelResponse', -100), KernelEvents::EXCEPTION => 'onKernelException', KernelEvents::TERMINATE => array('onKernelTerminate', -1024), ); } } __halt_compiler();----SIGNATURE:----AqvbmHID6tvMS/ZE3fUC1hY72VF1pVKcYqY6xojdl2DTcEjimejYngb2n1m5+D3bFjuVv/1sHOQDLrUQQ8idBFLTbmiTZYDKtFJnBhN80S7xYnx9Vpr/j8tieXH7ZA4gaMoRwss5253eKlpR9qOL//GEYtmmUm2JqS8dFaqxg8Mk9LQN+p2VF05wevmnyTC/j7ilCgLr+vp2D//FS8uy00FdoOsI7FTy2n2v2gVGOHfN2u7oZXDfSgz2UKNQQgUN8f75wM9p6bsEyyUrF/ClYkCV4FCz2oH8qIcdKN1mfpkdyRESUOEHO3demSYr2NiPAToQtiI1DgxYeUO0sBoTW7IXPRez9Vm7+v8EFWyPbQEgaBPElonWjTg34CsKknOymfeuSFJjiU3oOZ/65dRMceCvzxQyDFLvmCYj8jWFXdzufYFGH+73S88AE2XLIQsqfpeiCVbysV2WAt7u8P5+JxQopIB/1UeXUmfv4g0PGeicELy7c+utGrKq9lGdk7GgDSgN21OM8C0TF0mNvDJ3W5/8Fw6capIhuRKn16yNRdCC90UuTImDo0IMUMv1ZuABzMp7y5MNHTGXWTYM6F2i5D9FI1CX/rByf33Oei3nK9GVHAU4aNMpYKt1c0pCap5dpjFP9EZAPZ5sV71UitKsImnEZU5M0OiZIn9XY4fD+QM=----ATTACHMENT:----ODM3NDAwOTIwNDI5NzU4MSA3Njk2ODk2MTc5Nzk0MzE1IDgyNDUwMDM0NTIwMDMwNDI=