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