PHP Symfony Silex,在finish()之前不发送响应

PHP Symfony Silex,在finish()之前不发送响应,php,symfony,Php,Symfony,我想做的是:用户进行API调用,我给出响应,然后我开始做一些需要很长时间的动作,比如发送电子邮件。(电子邮件需要很长时间,因为我使用的是SMTP,所以swiftmailer会以同步方式执行。) 根据这一点,应该在发送响应后调用finish()。然而,当我测试这一点时,情况似乎并非如此。我的客户端一直在等待finish()完成 服务器端代码: $app = new Silex\Application(); $app->get('/hello', function (Request $r)

我想做的是:用户进行API调用,我给出响应,然后我开始做一些需要很长时间的动作,比如发送电子邮件。(电子邮件需要很长时间,因为我使用的是SMTP,所以swiftmailer会以同步方式执行。)

根据这一点,应该在发送响应后调用finish()。然而,当我测试这一点时,情况似乎并非如此。我的客户端一直在等待finish()完成

服务器端代码:

$app = new Silex\Application();

$app->get('/hello', function (Request $r) use($app) {

    return $app->json("I should load within a few milliseconds.");
});


$app->finish(function() use () {
    //Pretend to do some slow action afterwards
    sleep(5);

});

$app->run();
现在如果我加载页面
http://localhost/hello
加载它需要5秒钟。而我的期望是,它将立即加载。我是不是误解了文件

更新: 从技术上讲,被接受的答案符合我的要求。实际上,我找到了一个不同的解决方案:

我在寻找一种让最终用户不必等待的方式来发送电子邮件。出于我的目的,我转而使用
Swift\u MailTransport
而不是
Swift\u smtpransport
,并在本地将exim4配置为smarthost。这样,电子邮件将被发送到Exim4,脚本将立即继续

如果您正在寻找除电子邮件之外的其他长流程来执行,请查看消息队列,例如,我读到了关于它们的精彩文章

下面被接受的答案确实有效(也可以按照文档页面评论中的链接),但我发现解决方案不适合我的具体情况

我是不是误解了文件

不,你没有。web响应的内容在运行
finish
过滤器之前发送,但不发送输出。尝试添加

 ob_flush();
 flush();
睡眠(5)
之前,它将按照您的预期工作

你可能想要像这样的电子邮件。看

默认情况下,Swiftmailer提供商使用 TERMINATE事件,该事件在响应结束后激发 已经发出了


法拉盛给了我想要的一半。我确实立即看到了文本,但小旋转器仍然持续5秒钟。好像服务器说“等等,可能还有更多”。这也可以处理吗?这是因为您的浏览器使用了
保持活动状态
Connection:close
标题让浏览器知道它不应该保持持久连接:。我不明白的是Symfony的
response
使用
fastcgi\u finish\u请求
,所以所有这些都不应该是问题。你在使用PHP5.3+?我在这台开发机器上使用PHP5.5.12。(WAMP)我可以在()之后的
->中添加
连接:关闭
标题吗?