php中神奇的fastcgi_finish_request

2015-01-24信息快讯网

当PHP运行在FastCGI模式时,PHP FPM提供了一个名为fastcgi_finish_request的方法。按照文档上的说法,此方法可以提高请求的处理速度,如果有些处理可以在页面生成完后再进行,就可以使用这个方法。

听起来可能有些茫然,我们通过几个例子来说明一下:
 
<?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环境下造成问题.

比较discuz和ecshop的截取字符串函数php版
PHP 利用AJAX获取网页并输出的实现代码(Zjmainstay)
简单的方法让你的后台登录更加安全(php中加session验证)
php中3des加密代码(完全与.net中的兼容)
php读取文件内容至字符串中,同时去除换行、空行、行首行尾空格(Zjmainstay原创)
单一index.php实现PHP任意层级文件夹遍历(Zjmainstay原创)
php读取txt文件组成SQL并插入数据库的代码(原创自Zjmainstay)
PHP中防止直接访问或查看或下载config.php文件的方法
php中配置文件操作 如config.php文件的读取修改等操作
php.ini-dist 和 php.ini-recommended 的区别介绍(方便开发与安全的朋友)
apache+codeigniter 通过.htcaccess做动态二级域名解析
通过PHP的内置函数,通过DES算法对数据加密和解密
SESSION信息保存在哪个文件目录下以及能够用来保存什么类型的数据
php提示undefined index的几种解决方法
openflashchart 2.0 简单案例php版
PHP面向对象的进阶学习(抽像类、接口、final、类常量)
PHP file_exists问题杂谈
ecshop 批量上传(加入自定义属性)
PHP教程之PHP中shell脚本的使用方法分享
PHP逐行输出(ob_flush与flush的组合)
PHP中使用gettext来支持多语言的方法
PHP开发不能违背的安全规则 过滤用户输入
使用GROUP BY的时候如何统计记录条数 COUNT(*) DISTINCT
fleaphp rolesNameField bug解决方法
FirePHP 推荐一款PHP调试工具
fleaphp crud操作之find函数的使用方法
fleaphp crud操作之findByField函数的使用方法
php中利用post传递字符串重定向的实现代码
php将fileterms函数返回的结果变成可读的形式
flash用php连接数据库的代码
php中用数组的方法设置cookies
PHP中的session永不过期的解决思路及实现方法分享
关于session在PHP5的配置文件中的详细设置参数说明
PHP session有效期session.gc_maxlifetime
PHP的cURL库功能简介 抓取网页、POST数据及其他
PHP stream_context_create()作用和用法分析
php中突破基于HTTP_REFERER的防盗链措施(stream_context_create)
理解php Hash函数,增强密码安全
linux下删除7天前日志的代码(php+shell)
用PHP为SHOPEX增加日志功能代码
php ob_flush,flush在ie中缓冲无效的解决方法
©2014-2024 dbsqp.com