php中神奇的fastcgi_finish_request

 更新时间:2011年05月02日 13:03:57   作者:  
当PHP运行在FastCGI模式时,PHP FPM提供了一个名为fastcgi_finish_request的方法。按照文档上的说法,此方法可以提高请求的处理速度,如果有些处理可以在页面生成完后再进行,就可以使用这个方法。
听起来可能有些茫然,我们通过几个例子来说明一下:
复制代码 代码如下:

<?php
echo '例子:';
fastcgi_finish_request();
echo 'To be, or not to be, that is the question.';
file_put_contents('log.txt', '生存还是毁灭,这是个问题。');
?>

通过浏览器(不是命令行!)运行此脚本,结果发现并没有输出相应的字符串,但却生成了相应的文件。由此说明在调用fastcgi_finish_request后,客户端响应就已经结束,但与此同时服务端脚本却继续运行!
合理利用这个特性可以大大提升用户体验,趁热打铁再来一个例子:
复制代码 代码如下:

<?php
echo '例子:';
file_put_contents('log.txt', date('Y-m-d H:i:s') . " 上传视频\n", FILE_APPEND);
fastcgi_finish_request();
sleep(1);
file_put_contents('log.txt', date('Y-m-d H:i:s') . " 转换格式\n", FILE_APPEND);
sleep(1);
file_put_contents('log.txt', date('Y-m-d H:i:s') . " 提取图片\n", FILE_APPEND);
?>

代码里用sleep模拟一些耗时的操作,浏览时没有被堵塞,程序却都执行了,具体看日志。

末了给您提个醒,Yahoo在Best Practices for Speeding Up Your Web Site中提到了Flush the Buffer Early,也就是利用PHP中的flush方法把内容尽快发到客户端去,虽然表面上它和本文介绍的fastcgi_finish_request有些许的类似,但本质上完全不同,别混淆了。

转载附言: 我看了下这个方法, 在调用的时候, 会发送响应, 关闭连接. 但是不会结束PHP的运行. 相比调用flush, 或者我之前介绍的加速你的Echo来说, 这个方法能更加干脆一些.

另外, 从代码的可移植性讲的话, 可以在代码中附上如下代码:

复制代码 代码如下:

if (!function_exists("fastcgi_finish_request")) {
function fastcgi_finish_request() { }
}

不会造成代码部署在非fpm环境下造成问题.

相关文章

  • PHP中的函数-- foreach()的用法详解

    PHP中的函数-- foreach()的用法详解

    本篇文章是对PHP中的函数foreach()的用法进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • PHP 七大优势分析

    PHP 七大优势分析

    ASP是微软公司实现动态网页的一种技术。ASP支持一些脚本语言,主要以VBScripp为主。与ASP相比较,你还可以选择另一中开放源代码编程语言——PHP,PHP可以运行在多种操作系统下,其中包括Linux和windows。
    2009-06-06
  • PHP+redis实现微博的拉模型案例详解

    PHP+redis实现微博的拉模型案例详解

    这篇文章主要介绍了PHP+redis实现微博的拉模型案例,结合具体实例形式详细分析了php+redis获取关注人最新信息的相关原理与操作技巧,需要的朋友可以参考下
    2019-07-07
  • 浅析php fwrite写入txt文件的时候用 \r\n不能换行的问题

    浅析php fwrite写入txt文件的时候用 \r\n不能换行的问题

    以下是对php中fwrite写入txt文件的时候用 \r\n不能换行的问题进行了介绍,需要的朋友可以过来参考下
    2013-08-08
  • PHP常用的三种设计模式汇总

    PHP常用的三种设计模式汇总

    本文给大家简单介绍了PHP中最常用的三种设计模式:单例设计模式、工厂设计模式和观察者设计模式。都是个人的一些经验总结,希望小伙伴们能够喜欢
    2016-08-08
  • PHP define函数的使用说明

    PHP define函数的使用说明

    PHP预先定义了几个常量,并提供了一种机制在运行时自己定义。常量和变量基本上是一样的,不同的是:常量必须用DEFINE函数定义,常量一旦定义好,就不能被重新定义了。
    2008-08-08
  • PHP日志LOG类定义与用法示例

    PHP日志LOG类定义与用法示例

    这篇文章主要介绍了PHP日志LOG类定义与用法,结合实例形式分析了日志log的具体定义及使用方法,涉及php文件读写、日期时间及字符串等相关操作技巧,需要的朋友可以参考下
    2018-09-09
  • PHP读取XML文件的方法实例总结【DOMDocument及simplexml方法】

    PHP读取XML文件的方法实例总结【DOMDocument及simplexml方法】

    这篇文章主要介绍了PHP读取XML文件的方法,结合实例形式总结分析了php基于DOMDocument及simplexml方法针对xml文件的载入、读取等相关操作技巧,需要的朋友可以参考下
    2019-09-09
  • apache2.2.4+mysql5.0.77+php5.2.8安装精简

    apache2.2.4+mysql5.0.77+php5.2.8安装精简

    linux下apache php环境的配置方法。
    2009-04-04
  • PHP计算个人所得税示例【不使用速算扣除数】

    PHP计算个人所得税示例【不使用速算扣除数】

    这篇文章主要介绍了PHP计算个人所得税,结合实例形式分析了php自定义函数不使用速算扣除数计算个人所得税的相关操作技巧,涉及数组遍历、数值运算的简单使用,需要的朋友可以参考下
    2018-03-03

最新评论