【问题标题】:How to correctly use silex "finish" middleware to process heavy operations in background?如何正确使用 silex “完成” 中间件在后台处理繁重的操作?
【发布时间】:2016-06-03 20:50:08
【问题描述】:

我正在根据文档在 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 中间件中刷新缓冲区?如果没有这些操作,只有在完成中间件处理程序完成后才会收到服务器响应。

【问题讨论】:

  • 能否请您详细说明此问答,因为我的观点完全相同。如果您可以花一些时间为您的问题添加更多解释并提供更详细的答案,那将会很有帮助。提前Tnx。例如,您如何检测 pdf 的源数据是什么,因为在所有路线上都触发了完成
  • @Trix 如果我理解正确,您需要通知浏览器有关新的 pdf 文件。您可以为此目的使用 WebSocket。这样您就不需要直接监视完成中间件处理程序的结果。
  • @Trix 我的任务如下:保存用户输入,根据它生成 pdf 报告,并用这个报告发送一封信。处理用户输入后,我向浏览器发送响应并关闭连接(“之后”部分)。在“完成”部分,我正在处理 $response 对象,生成文件并发送一封信(此处没有通知浏览器)。
  • Tnx 回复你,this 是我所追求的

标签: php middleware silex flush symfony-http-foundation


【解决方案1】:

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

【讨论】:

  • 但是在向浏览器发送响应后会发生“TERMINATE”事件,并且所有缓存都被 fastcgi_finish_request/ob_end_flush/ob_end_clean 清除(之后不再发送),然后才调用“完成”中间件处理程序。我错过了什么吗?
  • fastcgi_finish_request - 它是 php-fpm 函数。你用php-fpm吗?
  • 不,我只是列出了一组可能的功能。其中一个调用,在发送响应后(在 Symfony\Component\HttpFoundation\Response 中)。
  • 我也看过。 ob_.. 函数在脚本级别使用缓冲区,因此在 ob_end_flush php 将输出缓冲区发送到系统之后。比 flush() 刷新系统输出缓冲区 (php.net/manual/en/function.flush.php)。这只是我的假设..
猜你喜欢
  • 2013-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多