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 相关文章推荐
libmysql.dll与php.ini是否真的要拷贝到c:\windows目录下呢
Mar 15 PHP
PHP自动选择 连接本地还是远程数据库
Dec 02 PHP
php三维数组去重(示例代码)
Nov 26 PHP
php curl模拟post提交数据示例
Dec 31 PHP
php跨站攻击实例分析
Oct 28 PHP
IIS下PHP的三种配置方式对比
Nov 20 PHP
php curl 获取https请求的2种方法
Apr 27 PHP
ECSHOP在PHP5.5及高版本上报错的解决方法
Aug 31 PHP
php基于curl实现的股票信息查询类实例
Nov 11 PHP
PHP中list方法用法示例
Dec 01 PHP
基于ThinkPHP5.0实现图片上传插件
Sep 25 PHP
Yii框架的布局文件实例分析
Sep 04 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/12/19 PHP
解析PHP 使用curl提交json格式数据
2013/06/29 PHP
php通过session防url攻击方法
2014/12/10 PHP
php实现session自定义会话处理器的方法
2015/01/27 PHP
深入理解PHP内核(一)
2015/11/10 PHP
基于PHP代码实现中奖概率算法可用于刮刮卡、大转盘等抽奖算法
2015/12/20 PHP
PHP实现加密文本文件并限制特定页面的存取的效果
2016/10/21 PHP
laravel5.5安装jwt-auth 生成token令牌的示例
2019/10/24 PHP
PHP 超级全局变量相关总结
2020/06/30 PHP
javascript截取字符串(通过substring实现并支持中英文混合)
2013/06/24 Javascript
js通过更改按钮的显示样式实现按钮的滑动效果
2014/04/23 Javascript
jQuery实现页面倒计时并刷新效果
2017/03/13 Javascript
移动端web滚动分页的实现方法
2017/05/05 Javascript
详解Angular2中Input和Output用法及示例
2017/05/21 Javascript
浅谈react.js中实现tab吸顶效果的问题
2017/09/06 Javascript
vue实现某元素吸顶或固定位置显示(监听滚动事件)
2017/12/13 Javascript
JS实现骰子3D旋转效果
2019/10/24 Javascript
js实现计时器秒表功能
2019/12/16 Javascript
node实现mock-plugin中间件的方法
2019/12/25 Javascript
js实现扫雷源代码
2020/11/27 Javascript
python获取mp3文件信息的方法
2015/06/15 Python
python kafka 多线程消费者&amp;手动提交实例
2019/12/21 Python
Nebula美国官网:便携式投影仪
2019/03/15 全球购物
Android笔试题总结
2014/11/29 面试题
留学自荐信
2013/10/10 职场文书
骨干教师培训感言
2014/01/16 职场文书
党员干部三严三实心得体会
2014/10/13 职场文书
2015年公司后勤管理工作总结
2015/05/13 职场文书
2015年街道除四害工作总结
2015/05/15 职场文书
2015年领导干部廉洁自律工作总结
2015/05/26 职场文书
餐馆开业致辞
2015/08/01 职场文书
房产销售员2015年终工作总结
2015/10/22 职场文书
CSS3 制作的书本翻页特效
2021/04/13 HTML / CSS
Python import模块的缓存问题解决方案
2021/06/02 Python
MySQL索引失效的典型案例
2021/06/05 MySQL
无线电通信名词解释
2022/02/18 无线电