使用fastcgi_finish_request提高页面响应速度

原文链接:http://www.laruence.com/2011/04/13/1991.html
Fastcgi_finish_request文档:http://php.net/manual/zh/function.fastcgi-finish-request.php
PHP运行在FastCGI模式时,PHP FPM提供了一个名为fastcgi_finish_request的方法.按照文档上的说法,此方法可以提高请求的处理速度,如果有些处理可以在页面生成完后再进行,就可以使用这个方法.
听起来可能有些茫然,我们通过几个例子来说明一下:
1.
通过浏览器访问此脚本, 结果发现并没有输出相应的字符串,但却生成了相应的文件.由此说明在调用fastcgi_finish_request后,客户端响应就已经结束,但与此同时服务端脚本却继续运行!
合理利用这个特性可以大大提升用户体验,趁热打铁再来一个例子:
1.
代码里用sleep模拟一些耗时的操作,浏览时没有被堵塞,程序却都执行了,具体看日志.
末了给您提个醒,Yahoo在Best Practices for Speeding Up Your Web Site中提到了Flush the Buffer Early,也就是利用PHP中的flush方法把内容尽快发到客户端去,它和本文介绍的fastcgi_finish_request有些许的类似.
转载附言: 我看了下这个方法, 在调用的时候, 会发送响应, 关闭连接. 但是不会结束PHP的运行. 相比调用flush, 或者我之前介绍的加速你的Echo来说, 这个方法能更加干脆一些.
另外, 从代码的可移植性讲的话, 可以在代码中附上如下代码:
1. if (!function_exists(“fastcgi_finish_request”)) {
2. function fastcgi_finish_request() {
3. }
4. }
不会造成代码部署在非fpm环境下造成问题.
总结:之前flush只有在cli模式下运行才有效,这个方法亲测在服务器端FastCGI模式下生效。
封装函数

    public static function FlushJson($msg = ''){
        if (!function_exists("fastcgi_finish_request")) {
              function fastcgi_finish_request()  { }
        }
        if (!headers_sent()) {
            header('Content-type: application/json; charset=utf-8', TRUE);
        }
        echo json_encode($msg);
        fastcgi_finish_request();
        return;
    }

发表评论

邮箱地址不会被公开。 必填项已用*标注


*