Как правильно использовать silex & quot; конец & quot; промежуточное программное обеспечение для обработки тяжелых операций в фоновом режиме?

Я пишу приложение на Silex в соответствии с документацией, но с некоторыми дополнениями. Я объявляю маршрут после промежуточного программного обеспечения для маршрута и заканчиваю промежуточное программное обеспечение для приложения.

$app->put('/request/', function (Request $request) use ($app) {
// ... some code here ...

return $app->json(['requestId' => $requestId], 201);
})->bind('create_request')
->after(function(Request $request, Response $response) {
$contentLength = mb_strlen($response->getContent(), 'utf-8');
$response->headers->set('Content-length', $contentLength, true);
$response->headers->set('Connection', 'close', true);
});

$app->finish(function (Request $request, Response $response, Application $app) {
flush();

// ... generate big pdf file, attach it to email and send via swiftmailer ...
});

Приведенный выше код работает так, как мне нужно: ответ отправлен, спиннер браузера остановлен, тяжелая операция обрабатывается в фоновом режиме. Но остается открытым вопрос: нужно ли добавлять заголовки к ответу после промежуточного ПО и очищать буфер в готовом промежуточном ПО? Без этих манипуляций ответ сервера получен только после завершения обработчика финишного промежуточного программного обеспечения.

3

Решение

Я думаю, что это необходимо.
->after( является RESPONSE событие, которое вызывается, когда ответ подготовлен, но не отправлен. В вашем случае добавляются все необходимые заголовки, чтобы закрыть соединение, когда браузер получает ответ.
->finish( является TERMINATE событие, которое вызывается после отправки ответа. flush() — Я думаю, что раньше он сбрасывал ответ из буфера сервера в браузер.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]