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+AJAX实现无刷新注册(带用户名实时检测)
Jan 02 PHP
Search File Contents PHP 搜索目录文本内容的代码
Feb 21 PHP
phpadmin如何导入导出大数据文件及php.ini参数修改
Feb 18 PHP
Mysql中分页查询的两个解决方法比较
May 02 PHP
Laravel 5框架学习之表单
Apr 08 PHP
PHP模板引擎smarty详细介绍
May 26 PHP
PHP获得数组交集与差集的方法
Jun 10 PHP
ThinkPHP数据操作方法总结
Sep 28 PHP
PHP时间戳格式全部汇总 (获取时间、时间戳)
Jun 13 PHP
php实现查询功能(数据访问)
May 23 PHP
php中请求url的五种方法总结
Jul 13 PHP
Windows平台PHP+IECapt实现网页批量截图并创建缩略图功能详解
Aug 02 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
咖啡知识 除了喝咖啡还有那些知识点
2021/03/06 新手入门
PHP 编程请选择正确的文本编辑软件
2006/12/21 PHP
thinkphp缓存技术详解
2014/12/09 PHP
WordPress分页伪静态加html后缀
2016/06/08 PHP
关于PHP中字符串与多进制转换函数的实例代码
2016/11/03 PHP
PHP网页安全认证的实例详解
2017/09/28 PHP
PHP手机号码及邮箱正则表达式实例解析
2020/07/11 PHP
document.compatMode介绍
2009/05/21 Javascript
JavaScript代码简单实现求杨辉三角给定行的最大值
2013/10/29 Javascript
jQuery实现跨域iframe接口方法调用
2015/03/14 Javascript
jQuery Ajax调用WCF服务详细教程
2015/03/31 Javascript
require.js配合插件text.js实现最简单的单页应用程序
2016/07/12 Javascript
javascript 解决浏览器不支持的问题
2016/09/24 Javascript
微信小程序  网络请求API详解
2016/10/25 Javascript
Bootstrap学习笔记 轮播(Carousel)插件
2017/03/21 Javascript
jQuery实现简单的下拉菜单导航功能示例
2017/12/07 jQuery
浅谈Webpack核心模块tapable解析
2018/09/11 Javascript
bootstrap中的导航条实例代码详解
2019/05/20 Javascript
Python中实现两个字典(dict)合并的方法
2014/09/23 Python
Python 正则表达式入门(中级篇)
2016/12/07 Python
Python实现修改IE注册表功能示例
2018/05/10 Python
python xlsxwriter创建excel图表的方法
2018/06/11 Python
在python中画正态分布图像的实例
2019/07/08 Python
python配置文件写入过程详解
2019/10/19 Python
Python面向对象中类(class)的简单理解与用法分析
2020/02/21 Python
python读取hdfs上的parquet文件方式
2020/06/06 Python
Python高并发解决方案实现过程详解
2020/07/31 Python
python实现三种随机请求头方式
2021/01/05 Python
css3实现背景动态渐变效果
2019/12/10 HTML / CSS
英国第一摩托车和摩托车越野配件商店:GhostBikes
2019/03/10 全球购物
Nasty Gal英国:美国女性服饰销售网站
2021/03/02 全球购物
个人作风建设自查报告
2014/10/22 职场文书
2015年人事科工作总结
2015/04/28 职场文书
驻村工作简报
2015/07/20 职场文书
2019暑假学生安全口号
2019/06/27 职场文书
面试官问我Mysql的存储引擎了解多少
2022/08/05 MySQL