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 相关文章推荐
?生?D片??C字串
Dec 06 PHP
php合并数组array_merge函数运算符加号与的区别
Oct 31 PHP
php实现的仿阿里巴巴实现同类产品翻页
Dec 11 PHP
删除html标签得到纯文本可处理嵌套的标签
Apr 28 PHP
PHP中soap的用法实例
Oct 24 PHP
简单谈谈PHP中的trait
Feb 25 PHP
PHP中的浅复制与深复制的实例详解
Oct 26 PHP
YII框架http缓存操作示例
Apr 29 PHP
php函数式编程简单示例
Aug 08 PHP
php把文件设置为插件的技巧方法
Feb 03 PHP
PHP语言对接抖音快手小红书视频/图片去水印API接口源码
Aug 11 PHP
PHP网站常见安全漏洞,及相应防范措施总结
Mar 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
php 遍历数据表数据并列表横向排列的代码
2009/09/05 PHP
php笔记之:初探PHPcms模块开发介绍
2013/04/26 PHP
深入PHP运行环境配置的详解
2013/06/04 PHP
php可应用于面包屑导航的迭代寻找家谱树实现方法
2015/02/02 PHP
详解WordPress中用于合成数组的wp_parse_args()函数
2015/12/18 PHP
PHP利用正则表达式将相对路径转成绝对路径的方法示例
2017/02/28 PHP
JavaScript isPrototypeOf和hasOwnProperty使用区别
2010/03/04 Javascript
jquery插件开发之实现google+圈子选择功能
2014/03/10 Javascript
js实现jquery的offset()方法实例
2015/01/10 Javascript
Angularjs基础知识及示例汇总
2015/01/22 Javascript
JS实现向表格中动态添加行的方法
2015/03/30 Javascript
js判断子窗体是否关闭的方法
2015/08/11 Javascript
jquery移动端TAB触屏切换实现效果
2020/12/22 Javascript
微信小程序 购物车简单实例
2016/10/24 Javascript
微信公众号菜单配置微信小程序实例详解
2017/03/31 Javascript
基于AngularJS的简单使用详解
2017/09/10 Javascript
详解实现一个通用的“划词高亮”在线笔记功能
2019/04/23 Javascript
vue-i18n结合Element-ui的配置方法
2019/05/20 Javascript
JS实现在线ps功能详解
2019/07/31 Javascript
微信小程序 textarea 层级过高问题简单解决方案
2019/10/14 Javascript
[50:24]VGJ.S vs Pain 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
python 获取et和excel的版本号
2009/04/09 Python
python封装对象实现时间效果
2020/04/23 Python
python获取远程图片大小和尺寸的方法
2015/03/26 Python
使用Python的Flask框架实现视频的流媒体传输
2015/03/31 Python
python数据抓取分析的示例代码(python + mongodb)
2017/12/25 Python
Python多重继承的方法解析执行顺序实例分析
2018/05/26 Python
Tensorflow 多线程与多进程数据加载实例
2020/02/05 Python
Python3实现建造者模式的示例代码
2020/06/28 Python
html5拍照功能实现代码(htm5上传文件)
2013/12/11 HTML / CSS
尤妮佳moony海外旗舰店:日本殿堂级纸尿裤品牌
2018/02/23 全球购物
如何实现jdbc性能优化
2012/07/30 面试题
房地产销售经理岗位职责
2014/01/01 职场文书
语文教学感言
2014/02/06 职场文书
管理部副部长岗位职责范文
2014/03/09 职场文书
2014年信息宣传工作总结
2014/12/18 职场文书