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中ADODB类详解
Mar 25 PHP
腾讯QQ php程序员面试题目整理
Jun 08 PHP
php入门学习知识点八 PHP中for循环基本应用之九九乘法口绝表
Jul 14 PHP
php实现批量下载百度云盘文件例子分享
Apr 10 PHP
PHP内置过滤器FILTER使用实例
Jun 25 PHP
ThinkPHP使用smarty模板引擎的方法
Jul 01 PHP
php 伪造ip以及url来路信息方法汇总
Nov 25 PHP
Linux平台php命令行程序处理管道数据的方法
Nov 10 PHP
php版微信小店调用api示例代码
Nov 12 PHP
PHP封装的PDO数据库操作类实例
Jun 21 PHP
浅析PHP 中move_uploaded_file 上传中文文件名失败
Apr 17 PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
Feb 21 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编写的导航条程序
2006/10/09 PHP
php 模拟get_headers函数的代码示例
2013/04/27 PHP
推荐一款PHP+jQuery制作的列表分页的功能模块
2014/10/14 PHP
php验证码生成代码
2015/11/11 PHP
简单谈谈php浮点数精确运算
2016/03/10 PHP
用jQuery扩展自写的 UI导航
2010/01/13 Javascript
js 使FORM表单的所有元素不可编辑的示例代码
2013/10/17 Javascript
Javascript中实现trim()函数的两种方法
2015/02/04 Javascript
js简单判断移动端系统的方法
2016/02/25 Javascript
Javascript 6里的4个新语法
2016/08/25 Javascript
Bootstarp 基础教程之表单部分实例代码
2017/02/03 Javascript
详解angularjs结合pagination插件实现分页功能
2017/02/10 Javascript
js判断PC端与移动端跳转
2020/12/24 Javascript
requireJS模块化实现返回顶部功能的方法详解
2017/10/16 Javascript
微信小程序实现全国机场索引列表
2018/01/31 Javascript
使用Vuex实现一个笔记应用的方法
2018/03/13 Javascript
vue引用js文件的多种方式(推荐)
2018/05/17 Javascript
vue+php实现的微博留言功能示例
2019/03/16 Javascript
vue 集成 vis-network 实现网络拓扑图的方法
2019/08/07 Javascript
vant实现购物车功能
2020/06/29 Javascript
python装饰器与递归算法详解
2016/02/18 Python
python3文件复制、延迟文件复制任务的实现方法
2019/09/02 Python
使用python写一个自动浏览文章的脚本实例
2019/12/05 Python
Python多线程操作之互斥锁、递归锁、信号量、事件实例详解
2020/03/24 Python
jupyternotebook 撤销删除的操作方式
2020/04/17 Python
canvas裁剪clip()函数的具体使用
2018/03/01 HTML / CSS
方法名是否可以与构造器的名字相同
2012/06/04 面试题
职业生涯规划书的格式
2013/12/29 职场文书
实践单位评语
2014/04/26 职场文书
承诺书格式
2014/06/03 职场文书
运动会标语
2014/06/21 职场文书
四风对照检查剖析材料
2014/10/07 职场文书
2014年小学数学教师工作总结
2014/12/03 职场文书
css实现两栏布局,左侧固定宽,右侧自适应的多种方法
2021/08/07 HTML / CSS
MySQL分库分表详情
2021/09/25 MySQL
我收到了德劲DE1107
2022/04/05 无线电