PHP: 提前关闭连接并继续在后台处理
我博客的评论是用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秒。问题依然没有完全解决。