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实现域名whois查询的代码(数据源万网、新网)
Feb 22 PHP
php设计模式 Interpreter(解释器模式)
Jun 26 PHP
用PHP写的基于Memcache的Queue实现代码
Nov 27 PHP
php异常处理使用示例
Feb 25 PHP
19个超实用的PHP代码片段
Mar 14 PHP
6个超实用的PHP代码片段
Aug 10 PHP
PHP目录操作实例总结
Sep 27 PHP
降低PHP Redis内存占用
Mar 23 PHP
Laravel框架Auth用户认证操作实例分析
Sep 29 PHP
解决laravel(5.5)访问public报错的问题
Oct 12 PHP
Laravel5.5 数据库迁移:创建表与修改表示例
Oct 23 PHP
PHP cookie与session会话基本用法实例分析
Nov 18 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
MySQL中create table语句的基本语法是
2007/01/15 PHP
php获取mysql字段名称和其它信息的例子
2014/04/14 PHP
ThinkPHP查询返回简单字段数组的方法
2014/08/25 PHP
PHP中上传多个文件的表单设计例子
2014/11/19 PHP
使用WordPress发送电子邮件的相关PHP函数用法解析
2015/12/15 PHP
php实现单笔转账到支付宝功能
2018/10/09 PHP
Yii框架中用response保存cookie,用request读取cookie的原理解析
2019/09/04 PHP
js技巧--转义符&quot;\&quot;的妙用
2007/01/09 Javascript
javascript使用activex控件的代码
2011/01/27 Javascript
js实现YouKu的漂亮搜索框效果
2015/08/19 Javascript
jQuery旋转木马式幻灯片轮播特效
2015/12/04 Javascript
Bootstrap中点击按钮后变灰并显示加载中实例代码
2016/09/23 Javascript
JS简单生成由字母数字组合随机字符串示例
2018/05/25 Javascript
[43:53]OG vs EG 2019国际邀请赛淘汰赛 胜者组 BO3 第三场 8.22
2019/09/05 DOTA
Python远程桌面协议RDPY安装使用介绍
2015/04/15 Python
Django内容增加富文本功能的实例
2017/10/17 Python
Python用户推荐系统曼哈顿算法实现完整代码
2017/12/01 Python
python实现redis三种cas事务操作
2017/12/19 Python
python利用smtplib实现QQ邮箱发送邮件
2020/05/20 Python
python画双y轴图像的示例代码
2019/07/07 Python
Python企业编码生成系统之系统主要函数设计详解
2019/07/26 Python
python中的RSA加密与解密实例解析
2019/11/18 Python
详解python内置常用高阶函数(列出了5个常用的)
2020/02/21 Python
python相对企业语言优势在哪
2020/06/12 Python
详解python中的三种命令行模块(sys.argv,argparse,click)
2020/12/15 Python
CSS3实现酷炫的3D旋转透视效果
2019/11/21 HTML / CSS
The Hut德国站点:时装、家居用品、美容等
2016/09/23 全球购物
丝芙兰中国官方商城:SEPHORA中国
2018/01/10 全球购物
adidas爱尔兰官方网站:阿迪达斯运动鞋和运动服
2019/11/01 全球购物
Love, Bonito国际官网:新加坡女装品牌
2021/03/13 全球购物
大学生职业生涯规划书的基本内容
2014/01/06 职场文书
个人安全生产承诺书
2014/05/22 职场文书
个人总结与自我评价
2015/02/14 职场文书
《刺客之王:C罗全景传记》:时代从来不会亏待手艺人
2019/11/28 职场文书
python数据分析之用sklearn预测糖尿病
2021/04/22 Python