PHP: 提前关闭连接并继续在后台处理

陪她去流浪 桃子 2015年05月06日 阅读次数:2704

我博客的评论是用Ajax提交的,本来响应速度是很快的,结果因为同步发送了通知邮件,导致平均评论提交时间延迟1秒到5秒不等,简直不能忍!

于是准备把邮件通知改在后台进行,方法就是:评论一旦提交成功就强制关闭与客户端的连接(忽略`Connection: Keep-Alive`),并发送`Connection: close`与`Content-Length: 内容长度`。

使用了如下代码,已精简,并没有发送HTTP内容,也就没使用`ob_start()`,`ob_get_length()`,`ob_end_flush()`了:

<?php

header('HTTP/1.1 200 OK');
header('Content-Length: 0');
header('Connection: close');
header('X-Connection: close');

flush();

sleep(5);

但就是死活关不了,浏览器一直在那儿转圈圈,非要等到5秒结束!而且`Connection: close`并没有生效,在浏览器那里居然是`Connection: keep-alive`,但`X-Connection: close`却是对的(这也就是我要加这个头的原因)。

Google了十几篇文章与多个SOF的问答,结果只有`1条评论[1]`提到(可能是我没看仔细),这跟`php-fpm`还有一腿!

到目前为止,fpm也就提供了一个函数:`fastcgi_finish_request[2]`,而其作用就是发送数据并关闭连接!

所以,除了前面的所有,你还需要一个`fastcgi_finish_request`调用。有一个问题是:浏览器收到的依然是`Connection: keep-alive`,虽然这次不用再多等5秒。问题依然没有完全解决。

引用

  1. PHP: close browser connection and keep on executing(11楼)
  2. PHP: fastcgi_finish_request

这篇文章的内容已被作者标记为“过时”/“需要更新”/“不具参考意义”。

标签:HTTP · php · FPM