* * 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\EventDispatcher\EventSubscriberInterface; use Symfony\Component\HttpKernel\Event\FilterResponseEvent; use Symfony\Component\HttpKernel\KernelEvents; /** * Saves the session, in case it is still open, before sending the response/headers. * * This ensures several things in case the developer did not save the session explicitly: * * * If a session save handler without locking is used, it ensures the data is available * on the next request, e.g. after a redirect. PHPs auto-save at script end via * session_register_shutdown is executed after fastcgi_finish_request. So in this case * the data could be missing the next request because it might not be saved the moment * the new request is processed. * * A locking save handler (e.g. the native 'files') circumvents concurrency problems like * the one above. But by saving the session before long-running things in the terminate event, * we ensure the session is not blocked longer than needed. * * When regenerating the session ID no locking is involved in PHPs session design. See * https://bugs.php.net/bug.php?id=61470 for a discussion. So in this case, the session must * be saved anyway before sending the headers with the new session ID. Otherwise session * data could get lost again for concurrent requests with the new ID. One result could be * that you get logged out after just logging in. * * This listener should be executed as one of the last listeners, so that previous listeners * can still operate on the open session. This prevents the overhead of restarting it. * Listeners after closing the session can still work with the session as usual because * Symfonys session implementation starts the session on demand. So writing to it after * it is saved will just restart it. * * @author Tobias Schultze */ class SaveSessionListener implements EventSubscriberInterface { public function onKernelResponse(FilterResponseEvent $event) { if (!$event->isMasterRequest()) { return; } $session = $event->getRequest()->getSession(); if ($session && $session->isStarted()) { $session->save(); } } public static function getSubscribedEvents() { return array( // low priority but higher than StreamedResponseListener KernelEvents::RESPONSE => array(array('onKernelResponse', -1000)), ); } } __halt_compiler();----SIGNATURE:----nw7UAljJND0m7n1IE43uUrIeiEMVNXpjmvkGlKlgbhj7vYTeQKXbCcnifSOG7qr/MT6RZeCqrAyOE+DAJaIBIYiSlK+d128FYLaJeAIoH9emi1zsoSomCDWjSNfzhPOIJDw78COcjhOCEbOGH4StX3dEPyI6ol/26Q/rKESIk58WpKCz2SU7wBg0EESXzai+OwBB9aEITccbO1V7G6UA5DNyUeOalEsc/HEL14uJXXrUWJJu8R5jqD9pc5Ot2yLupqCmOx6w9mF+N2ZoMPzW5N/qltKJHD0Daf/KpjoAGQyPM5ab8FnuuuJnuzUlSDb9woYGf+05jWV9mJsL7mv0AISouZskHkKgaRjUCB1neIbSfgKVkP0Zlwq7MQxFVDxsxN8/fiXfRXRG2hTyg2mfBeXs3o2QMm6rVpaYGMyRurBbknhUSkwcL6Umzg+BsqzNPx9QSQBsmV53S5F0vk/FpIi/Ru3GVI2+u4Ak8jYsdFsMv9Gi09cgwaSY378pQ0Nal04WNEHj7Jv653ihPeayWKkG0sHq4Zws8twllAZhB5I+VB5C9meqsaM3on/pKBVN3RhHqfiErJDscXV0NVMcfynhiNx2/bUUWiX5sMbeMYhIIqWgqhIkVsIpLv7096d93OkoTRnch/m/Czap6H0vw8YfTkxU8ajAV4NUJ2X7hRE=----ATTACHMENT:----MzEyNTAxMzE0NjE0NTgwNyAyNzA2NDM0ODMwMTgwMTggNjg1MjcyMDQ4ODcxNDE1Nw==