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 相关文章推荐
PHP,ASP.JAVA,JAVA代码格式化工具整理
Jun 15 PHP
PHP的explode和implode的使用说明
Jul 17 PHP
PHP5权威编程阅读学习笔记 附电子书下载
Jul 05 PHP
关于Sphinx创建全文检索的索引介绍
Jun 25 PHP
基于preg_match_all采集后数据处理的一点心得笔记(编码转换和正则匹配)
Jan 31 PHP
PHP反射使用实例和PHP反射API的中文说明
Jul 02 PHP
PHP中for循环与foreach的区别
Mar 06 PHP
弹出模态框modal的实现方法及实例
Sep 19 PHP
ThinkPHP框架整合微信支付之Native 扫码支付模式二图文详解
Apr 09 PHP
PHP token验证生成原理实例分析
Jun 05 PHP
windows 2008r2+php5.6.28环境搭建详细过程
Jun 18 PHP
PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
Dec 20 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
关于页面优化和伪静态
2009/10/11 PHP
PHP中array_merge和array相加的区别分析
2013/06/17 PHP
php中的ini配置原理详解
2014/10/14 PHP
php调用KyotoTycoon简单实例
2015/04/02 PHP
js函数使用技巧之 setTimeout(function(){},0)
2009/02/09 Javascript
javascript offsetX与layerX区别
2010/03/12 Javascript
javascript 闭包疑问
2010/12/30 Javascript
jquery ajax 简单范例(界面+后台)
2013/11/19 Javascript
简单的ajax连接库分享(不用jquery的ajax)
2014/01/19 Javascript
2014年最火的Node.JS后端框架推荐
2014/10/27 Javascript
Javascript基础教程之比较操作符
2015/01/18 Javascript
javascript实现dom动态创建省市纵向列表菜单的方法
2015/05/14 Javascript
JavaScript实现自动对页面上敏感词进行屏蔽的方法
2015/07/27 Javascript
javascript中checkbox使用方法实例演示
2015/11/19 Javascript
js实现异步循环实现代码
2016/02/16 Javascript
前端开发不得不知的10个最佳ES6特性
2017/08/30 Javascript
微信小程序实现拍照画布指定区域生成图片
2019/07/18 Javascript
js实现动态时钟
2020/03/12 Javascript
搭建vscode+vue环境的详细教程
2020/08/31 Javascript
在Django的上下文中设置变量的方法
2015/07/20 Python
Python实现爬虫抓取与读写、追加到excel文件操作示例
2018/06/27 Python
Python反爬虫技术之防止IP地址被封杀的讲解
2019/01/09 Python
python 有效的括号的实现代码示例
2019/11/11 Python
python数据处理——对pandas进行数据变频或插值实例
2020/04/22 Python
Numpy一维线性插值函数的用法
2020/04/22 Python
浅谈django框架集成swagger以及自定义参数问题
2020/07/07 Python
通过代码实例解析Pytest运行流程
2020/08/20 Python
python subprocess pipe 实时输出日志的操作
2020/12/05 Python
HTML5中的Article和Section元素认识及使用
2013/03/22 HTML / CSS
Chain Reaction Cycles俄罗斯:世界上最大的在线自行车商店
2019/08/27 全球购物
宿舍打麻将检讨书
2014/01/24 职场文书
群众路线自我剖析范文
2014/11/04 职场文书
2014年新农村建设工作总结
2014/12/01 职场文书
会议欢迎词范文
2015/01/27 职场文书
话题作文之关于呼唤
2019/11/29 职场文书
笔记本自带的win11如何跳过联网激活?
2022/04/20 数码科技