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 相关文章推荐
SMARTY学习手记
Jan 04 PHP
php HandlerSocket的使用
May 02 PHP
PHP验证码函数代码(简单实用)
Sep 29 PHP
PHP中数组的分组排序实例
Jun 01 PHP
destoon实现调用自增数字从1开始的方法
Aug 21 PHP
php中return的用法实例分析
Feb 28 PHP
php实现通过ftp上传文件
Jun 19 PHP
Zend Framework教程之Zend_Db_Table表关联实例详解
Mar 23 PHP
py文件转exe时包含paramiko模块出错解决方法
Aug 12 PHP
Zend Framework入门教程之Zend_Config组件用法详解
Dec 09 PHP
php处理抢购类功能的高并发请求
Feb 08 PHP
PHP设计模式之单例模式原理与实现方法分析
Apr 25 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使用mysqldump命令导出数据库
2015/04/14 PHP
PHP 中魔术常量的实例详解
2017/10/26 PHP
PHP defined()函数的使用图文详解
2019/07/20 PHP
PHP容器类的两种实现方式示例
2019/07/24 PHP
ie8模式下click无反应点击option无反应的解决方法
2014/10/11 Javascript
jQuery的end()方法使用详解
2015/07/15 Javascript
PageSwitch插件实现100种不同图片切换效果
2015/07/28 Javascript
jquery mobile实现可折叠的导航按钮
2017/03/11 Javascript
jQuery UI Grid 模态框中的表格实例代码
2017/04/01 jQuery
JavaScript表单验证实现代码
2017/05/22 Javascript
关于javascript作用域的常见面试题分享
2017/06/18 Javascript
jquery 给动态生成的标签绑定事件的几种方法总结
2018/02/24 jQuery
JavaScript+H5实现微信摇一摇功能
2018/05/23 Javascript
探索浏览器页面关闭window.close()的使用详解
2020/08/21 Javascript
js 实现碰撞检测的示例
2020/10/28 Javascript
javascript实现滚轮轮播图片
2020/12/13 Javascript
用Python编写一个简单的Lisp解释器的教程
2015/04/03 Python
Python实现批量读取word中表格信息的方法
2015/07/30 Python
python清除函数占用的内存方法
2018/06/25 Python
pycharm使用matplotlib.pyplot不显示图形的解决方法
2018/10/28 Python
图解python全局变量与局部变量相关知识
2019/11/02 Python
对python中return与yield的区别详解
2020/03/12 Python
html5构建触屏网站之touch事件介绍
2013/01/07 HTML / CSS
汽修专业学生自我鉴定
2013/11/16 职场文书
《珍珠泉》教学反思
2014/02/20 职场文书
《胖乎乎的小手》教学反思
2014/02/26 职场文书
小学先进集体事迹材料
2014/05/31 职场文书
体育教育毕业生自荐信
2014/06/29 职场文书
办理信用卡收入证明范例
2014/09/13 职场文书
2014国庆黄金周超市促销活动方案
2014/09/21 职场文书
2014年派出所工作总结
2014/11/21 职场文书
全陪导游词开场白
2015/05/29 职场文书
信仰观后感
2015/06/03 职场文书
Jupyter notebook 不自动弹出网页的解决方案
2021/05/21 Python
MySQL数据库配置信息查看与修改方法详解
2022/06/25 MySQL
python 镜像环境搭建总结
2022/09/23 Python