3

我正在根据文档在 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 ...
});

上面的代码按我的需要工作:发送响应,停止浏览器微调器,在后台处理繁重的操作。但是有一个悬而未决的问题:是否有必要在 after 中间件的响应中添加标头并在 Finish 中间件中刷新缓冲区?如果没有这些操作,只有在完成中间件处理程序完成后才会收到服务器响应。

4

1 回答 1

1

我认为这是必要的。
->after(RESPONSE在准备好响应但未发送时调用的事件。在您的情况下,添加了在浏览器收到响应时关闭连接的所有必要标头。
->finish(TERMINATE响应发送后调用的事件。flush()- 我认为它曾经将响应从服务器缓冲区刷新到浏览器。

于 2016-06-04T18:47:40.507 回答