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 xml文件操作实现代码(二)
Mar 20 PHP
PHP中break及continue两个流程控制指令区别分析
Apr 18 PHP
PHP运行时强制显示出错信息的代码
Apr 20 PHP
PHP中date()日期函数有关参数整理
Jul 19 PHP
PHP 输出URL的快捷方式示例代码
Sep 22 PHP
php不用正则验证真假身份证
Nov 06 PHP
php解决约瑟夫环示例
Apr 09 PHP
IIS下PHP的三种配置方式对比
Nov 20 PHP
PHP实现将浏览历史页面网址保存到cookie的方法
Jan 26 PHP
Smarty最简单实现列表奇偶变色的方法
Jul 01 PHP
phplist及phpmailer(组合使用)通过gmail发送邮件的配置方法
Mar 30 PHP
PHP的HTTP客户端Guzzle简单使用方法分析
Oct 30 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
解析thinkphp import 文件内容变量失效的问题
2013/06/20 PHP
关于js与php互相传值的介绍
2013/06/25 PHP
使用WAMP搭建PHP本地开发环境
2017/05/10 PHP
在Laravel中实现使用AJAX动态刷新部分页面
2019/10/15 PHP
在thinkphp5.0路径中实现去除index.php的方式
2019/10/16 PHP
PHP如何通过date() 函数格式化显示时间
2020/11/13 PHP
javaScript Array(数组)相关方法简述
2009/07/25 Javascript
javascript window对象属性整理
2009/10/24 Javascript
Extjs学习笔记之六 面版
2010/01/08 Javascript
详解JavaScript的变量和数据类型
2015/11/27 Javascript
node.js中使用Export和Import的方法
2017/09/18 Javascript
jQuery实现标签子元素的添加和赋值方法
2018/02/24 jQuery
jQuery替换节点元素的操作方法
2018/03/18 jQuery
javaScript实现游戏倒计时功能
2018/11/17 Javascript
一步快速解决微信小程序中textarea层级太高遮挡其他组件
2019/03/04 Javascript
vuex实现像调用模板方法一样调用Mutations方法
2019/11/06 Javascript
原生JS与JQ获取元素的区别详解
2020/02/13 Javascript
python 多线程应用介绍
2012/12/19 Python
python实现数组插入新元素的方法
2015/05/22 Python
浅谈Python实现Apriori算法介绍
2017/12/20 Python
Python实现的字典值比较功能示例
2018/01/08 Python
代码讲解Python对Windows服务进行监控
2018/02/11 Python
用TensorFlow实现lasso回归和岭回归算法的示例
2018/05/02 Python
python自动截取需要区域,进行图像识别的方法
2018/05/17 Python
Python面向对象之静态属性、类方法与静态方法分析
2018/08/24 Python
Python之lambda匿名函数及map和filter的用法
2019/03/05 Python
浅谈Python的条件判断语句if/else语句
2019/03/21 Python
python暴力解压rar加密文件过程详解
2019/07/05 Python
python sklearn常用分类算法模型的调用
2019/10/16 Python
基于pytorch 预训练的词向量用法详解
2020/01/06 Python
python、PyTorch图像读取与numpy转换实例
2020/01/13 Python
Python基于进程池实现多进程过程解析
2020/04/30 Python
香蕉共和国加拿大官网:Banana Republic加拿大
2018/08/06 全球购物
印度电子产品购物网站:Vijay Sales
2021/02/16 全球购物
重阳节登山活动方案
2014/02/03 职场文书
办公室主任竞聘演讲稿
2014/05/15 职场文书