php中神奇的fastcgi_finish_request


Posted in PHP onMay 02, 2011

听起来可能有些茫然,我们通过几个例子来说明一下:

<?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 相关文章推荐
教你IIS6的PHP最佳配置方法
Sep 05 PHP
PHP 程序员也要学会使用“异常”
Jun 16 PHP
PHP,ASP.JAVA,JAVA代码格式化工具整理
Jun 15 PHP
PHP逐行输出(ob_flush与flush的组合)
Feb 04 PHP
通过5个php实例细致说明传值与传引用的区别
Aug 08 PHP
PHP之APC缓存详细介绍 apc模块安装
Jan 13 PHP
浅析php单例模式
Nov 25 PHP
PHP+jquery实时显示网站在线人数的方法
Jan 04 PHP
PHP版本如何选择?应该使用哪个版本?
May 13 PHP
解决微信授权回调页面域名只能设置一个的问题
Dec 11 PHP
ThinkPHP 3.2.3实现页面静态化功能的方法详解
Aug 03 PHP
laravel 根据不同组织加载不同视图的实现
Oct 14 PHP
PHP开发不能违背的安全规则 过滤用户输入
May 01 #PHP
PHP 调试工具Debug Tools
Apr 30 #PHP
php debug 安装技巧
Apr 30 #PHP
vs中通过剪切板循环来循环粘贴不同内容
Apr 30 #PHP
php获取mysql数据库中的所有表名的代码
Apr 23 #PHP
使用GROUP BY的时候如何统计记录条数 COUNT(*) DISTINCT
Apr 23 #PHP
mysql_num_rows VS COUNT 效率问题分析
Apr 23 #PHP
You might like
简单谈谈PHP面向对象之标识对象
2017/06/27 PHP
PHP回调函数概念与用法实例分析
2017/11/03 PHP
php实现的中秋博饼游戏之绘制骰子图案功能示例
2017/11/06 PHP
ThinkPHP 3.2.3实现加减乘除图片验证码
2018/12/05 PHP
PHP实现一个轻量级容器的方法
2019/01/28 PHP
laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
2020/02/18 PHP
JavaScript OOP类与继承
2009/11/15 Javascript
使用Microsoft Ajax Minifier减小JavaScript文件大小的方法
2010/04/01 Javascript
jQuery 淡出一个图像到另一个图像的实现代码
2013/06/12 Javascript
JavaScript Array对象扩展indexOf()方法
2014/05/09 Javascript
教你用AngularJS框架一行JS代码实现控件验证效果
2014/06/23 Javascript
深入探讨JavaScript String对象
2015/03/09 Javascript
nodejs redis 发布订阅机制封装实现方法及实例代码
2016/12/15 NodeJs
详解angular ui-grid之过滤器设置
2017/06/07 Javascript
Vue实现百度下拉提示搜索功能
2017/06/21 Javascript
JavaScript实现简单图片轮播效果
2017/08/21 Javascript
浅谈Node Inspector 代理实现
2017/10/19 Javascript
使用vue-aplayer插件时出现的问题的解决
2018/03/02 Javascript
快速解决vue动态绑定多个class的官方实例语法无效的问题
2018/09/05 Javascript
微信小程序实现的canvas合成图片功能示例
2019/05/03 Javascript
在Vue环境下利用worker运行interval计时器的步骤
2019/08/01 Javascript
JavaScript实现消消乐的源代码
2021/01/12 Javascript
[01:35]2018完美盛典章节片——共竞
2018/12/17 DOTA
Python学习之asyncore模块用法实例教程
2014/09/29 Python
Python3搜索及替换文件中文本的方法
2015/05/22 Python
Python实现七彩蟒蛇绘制实例代码
2018/01/16 Python
tensorflow1.0学习之模型的保存与恢复(Saver)
2018/04/23 Python
Python使用pydub库对mp3与wav格式进行互转的方法
2019/01/10 Python
python处理“
2019/06/10 Python
英国领先的奢侈品零售商之一:CRUISE
2016/12/02 全球购物
初中生学习生活的自我评价
2013/11/20 职场文书
ktv中秋节活动方案
2014/01/30 职场文书
小学班级口号
2014/06/09 职场文书
新郎父亲婚礼致辞
2015/07/27 职场文书
mysql使用instr达到in(字符串)的效果
2022/04/03 MySQL
vue 自定义组件添加原生事件
2022/04/21 Vue.js