如何使用 fastcgi_finish_request() 的示例

26

有人能展示一下如何使用fastcgi_finish_request()函数的简单示例吗? 我在谷歌上搜过,但只找到了一些概述,有些人说他们成功地使用了它,但我找不到一个带有代码示例的。

例如,我有一个 PHP 对象。要将响应发送到浏览器,我会生成 HTML,然后通过getResult()返回它。然后再将结果 echo 出来。

像这样:

$obj = new controller();
echo $o->getResult();

假设我想利用这种优化技术向浏览器发送结果,然后完成一些潜在的长时间处理,比如连接到某些API,比如Facebook API。

我该如何操作呢?我知道基本上可以调用fastcgi_finish_request();,然后继续执行php脚本。

我只需要看到示例代码,我不够聪明,自己无法想出来。


我知道它需要以php-fpm方式运行的php。我已经按照这种方式设置好了,使用php 5.3作为fastcgi和lighttpd作为Web服务器。 - Dmitri
1个回答

56

我理解基本上我可以调用fastcgi_finish_request();然后继续执行 PHP 脚本。

是的,那就是你需要做的一切。

$obj = new controller();
echo $o->getResult();
fastcgi_finish_request();
do_facebook_thing();

为了让自己相信它正在工作,请按照以下步骤操作:

echo "Test";
fastcgi_finish_request();
sleep(10);
如果您删除第二行,则会发现浏览器需要等待10秒钟。

那么它可以用来代替异步排队来执行“后台作业”(例如发送电子邮件)吗? - Thomas Decaux
1
@ThomasDecaux,这是可能的,但在任务运行时仍需保持 Web 进程。最终,值得使用一个完全与 Web 进程分离的适当队列来处理不需要为页面服务的阻塞操作。 - Matthew
1
当然,我同意这是最懒的解决方案^^ 但这是一个好技巧要知道(我用它来记录日志,如果有错误,我会将错误消息发送给用户,然后发送电子邮件给程序员)。 - Thomas Decaux
2
为了使您的脚本与Apache兼容,请先添加一个function_exists()函数。 - kouton
嗨。我尝试了你的示例,它可以工作,是的。 但是!如果我快速刷新页面(每秒几次),那么我可以看到最后一次查询需要太长时间(可能从3到6秒)。这是什么原因?nginx workers等吗? - Dmitriy Apollonin
如果使用Apache和PHP-FPM,并调用此函数,则客户端连接将关闭,PHP将在后台继续运行,但是Apache会继续运行吗? - OAH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接