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 数学运算验证码实现代码
Oct 11 PHP
用php实现选择排序的解决方法
May 04 PHP
基于PHP一些十分严重的缺陷详解
Jun 03 PHP
php魔术方法与魔术变量、内置方法与内置变量的深入分析
Jun 03 PHP
PHP实现自动登入google play下载app report的方法
Sep 23 PHP
PHP+mysql+ajax轻量级聊天室实现方法详解
Oct 17 PHP
PHP随机获取未被微信屏蔽的域名(微信域名检测)
Mar 19 PHP
ThinkPHP实现附件上传功能
Apr 27 PHP
tp5(thinkPHP5框架)captcha验证码配置及验证操作示例
May 28 PHP
基于thinkphp6.0的success、error实现方法
Nov 05 PHP
PHP正则之正向预查与反向预查讲解与实例
Apr 06 PHP
Mac系统下搭建Nginx+php-fpm实例讲解
Dec 15 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程序员工具
2008/05/26 PHP
php入门学习知识点四 PHP正则表达式基本应用
2011/07/14 PHP
php注销代码(session注销)
2012/05/31 PHP
关于PHP的curl开启问题探讨
2014/04/08 PHP
ASP.NET jQuery 实例18 通过使用jQuery validation插件校验DropDownList
2012/02/03 Javascript
jquery入门必备的基本认识及实例(整理)
2013/06/24 Javascript
基于jQuery实现表单提交验证
2014/11/24 Javascript
JS点击链接后慢慢展开隐藏着图片的方法
2015/02/17 Javascript
JavaScript数组实现数据结构中的队列与堆栈
2016/05/26 Javascript
Ext JS框架程序中阻止键盘触发回退或者刷新页面的代码分享
2016/06/07 Javascript
零基础轻松学JavaScript闭包
2016/12/30 Javascript
用 js 的 selection range 操作选择区域内容和图片
2017/04/18 Javascript
Bootstrap table使用方法总结
2017/05/10 Javascript
基于webpack.config.js 参数详解
2018/03/20 Javascript
Vue CLI3 开启gzip压缩文件的方式
2018/09/30 Javascript
微信小程序使用map组件实现检索(定位位置)周边的POI功能示例
2019/01/23 Javascript
node.js express框架实现文件上传与下载功能实例详解
2019/10/15 Javascript
前端性能优化建议
2020/09/17 Javascript
Python OpenCV 直方图的计算与显示的方法示例
2018/02/08 Python
python编写弹球游戏的实现代码
2018/03/12 Python
pandas对指定列进行填充的方法
2018/04/11 Python
Python针对给定字符串求解所有子序列是否为回文序列的方法
2018/04/21 Python
Python collections中的双向队列deque简单介绍详解
2019/11/04 Python
numpy.linalg.eig() 计算矩阵特征向量方式
2019/11/29 Python
Python figure参数及subplot子图绘制代码
2020/04/18 Python
Django+Celery实现动态配置定时任务的方法示例
2020/05/26 Python
python统计mysql数据量变化并调用接口告警的示例代码
2020/09/21 Python
CSS3实现可爱的小黄人动画
2016/07/11 HTML / CSS
使用分层画布来优化HTML5渲染的教程
2015/05/08 HTML / CSS
将世界上最美丽的摄影作品转化为艺术作品:Photos.com
2017/11/28 全球购物
PHP开发工程师面试问题集锦
2012/11/01 面试题
实习教师自我鉴定
2013/12/09 职场文书
小学生成长感言
2014/01/30 职场文书
会展策划与管理专业求职信
2014/06/09 职场文书
学习心理学的体会
2014/11/07 职场文书
一文了解MYSQL三大范式和表约束
2022/04/03 MySQL