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下HTTP Response中的Chunked编码实现方法
Nov 19 PHP
解决163/sohu/sina不能够收到PHP MAIL函数发出邮件的问题
Mar 13 PHP
将博客园(cnblogs.com)数据导入到wordpress的代码
Jan 06 PHP
关于尾递归的使用详解
May 02 PHP
php中的strpos使用示例
Feb 27 PHP
PHP生成自适应大小的缩略图类及使用方法分享
May 06 PHP
php数组添加元素方法小结
Dec 20 PHP
php统计数组元素个数的方法
Jul 02 PHP
PHP 实现的将图片转换为TXT
Oct 21 PHP
CI框架整合smarty步骤详解
May 19 PHP
php 读取文件夹下所有图片、文件的实例
Oct 17 PHP
PHP copy函数使用案例代码解析
Sep 01 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
深入了解php4(2)--重访过去
2006/10/09 PHP
ThinkPHP2.0读取MSSQL提示Incorrect syntax near the keyword 'AS'的解决方法
2014/06/25 PHP
javascript IE中的DOM ready应用技巧
2008/07/23 Javascript
基本jquery的控制tabs打开的数量的代码
2010/10/17 Javascript
Javascript在IE和FireFox中的不同表现简析
2012/12/03 Javascript
javascript错误的认识不用关心内存管理
2012/12/15 Javascript
node.js中的buffer.slice方法使用说明
2014/12/10 Javascript
jQuery中even选择器的定义和用法
2014/12/23 Javascript
jQuery仿gmail实现fixed布局的方法
2015/05/27 Javascript
jquery实现简单的自动播放幻灯片效果
2015/06/13 Javascript
javascript同步服务器时间和同步倒计时小技巧
2015/09/24 Javascript
详解Angularjs中的依赖注入
2016/03/11 Javascript
JavaScript 冒泡排序和选择排序的实现代码
2016/09/03 Javascript
WdatePicker.js时间日期插件的使用方法
2017/07/26 Javascript
vue.js的手脚架vue-cli项目搭建的步骤
2017/08/30 Javascript
为什么我们要做三份 Webpack 配置文件
2017/09/18 Javascript
通过vue-router懒加载解决首次加载时资源过多导致的速度缓慢问题
2018/04/08 Javascript
vue裁切预览组件功能的实现步骤
2018/05/04 Javascript
Vue Components 数字键盘的实现
2019/09/18 Javascript
浅谈关于vue中scss公用的解决方案
2019/12/02 Javascript
ES6如何用一句代码实现函数的柯里化
2020/01/18 Javascript
Vue实现简单的留言板
2020/10/23 Javascript
Python语言技巧之三元运算符使用介绍
2013/03/04 Python
github配置使用指南
2014/11/18 Python
Python使用cookielib模块操作cookie的实例教程
2016/07/12 Python
Python字符串中添加、插入特定字符的方法
2019/09/10 Python
Python hmac模块使用实例解析
2019/12/24 Python
python 装饰器的实际作用有哪些
2020/09/07 Python
阿波罗盒子:Apollo Box
2017/08/14 全球购物
网络通讯中,端口有什么含义,端口的取值范围
2012/11/23 面试题
Python如何实现单例模式
2016/06/03 面试题
2014向国旗敬礼网上签名活动总结
2014/09/27 职场文书
入股协议书范本
2014/11/01 职场文书
高中班主任工作总结(范文)
2019/08/20 职场文书
创业计划书之牛肉汤快餐店
2019/10/08 职场文书
Pyhton模块和包相关知识总结
2021/05/12 Python