Moje zrozumienie kernel.terminate
polega na tym, że po wywołuje on odpowiedź na klienta.Odpowiedź zwrócona dopiero po zdarzeniu kernel.terminate
W moich testach trudne, nie wydaje się, aby tak było. Jeśli wstawię sleep(10)
w funkcji, która jest wywoływana na kernel.terminate. przeglądarka czeka również przez 10 sekund. Przetwarzanie wydaje się mieć miejsce przed wysłaniem odpowiedzi.
Mam następujący w config:
calendar:
class: Acme\CalendarBundle\Service\CalendarService
arguments: [ @odm.document_manager, @logger, @security.context, @event_dispatcher ]
tags:
- { name: kernel.event_subscriber }
Moja klasa abonent:
class CalendarService implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return array(
'kernel.terminate' => 'onKernelTerminate'
);
}
public function onKernelTerminate()
{
sleep(10);
echo "hello";
}
}
UPDATE
To wydaje się być związane z Symfony nie wysyłając Content-Length
nagłówek. Jeśli to wygeneruję, odpowiedź wróci poprawnie.
// app_dev.php
...
$kernel = new AppKernel('dev', true);
$kernel->loadClassCache();
$request = Request::createFromGlobals();
$response = $kernel->handle($request);
// --- START EDITS ---
$size = strlen($response->getContent());
$response->headers->set('Content-Length', $size);
$response->headers->set('Connection', 'close');
// ---- END EDITS ----
$response->send();
$kernel->terminate($request, $response);
Czy to błąd w Symfony, czy jest jakiś cel? –