Home > php教程 > php手册 > 使用fastcgi_finish_request实现后台异步处理及提高页面响应速度

使用fastcgi_finish_request实现后台异步处理及提高页面响应速度

WBOY
Release: 2016-05-26 08:19:55
Original
1791 people have browsed it

fastcgi_finish_request()是冲刷(flush)所有响应的数据给客户端并结束请求,这使得客户端结束连接后,需要大量时间运行的任务能够继续运行,当PHP运行在FastCGI模式时,PHP FPM提供了一个名为fastcgi_finish_request的方法.按照文档上的说法,此方法可以提高请求的处理速度,如果有些处理可以在页面生成完后再进行,就可以使用这个方法.

听起来可能有些茫然,我们通过几个例子来说明一下:

<?php 
	 
	echo &#39;例子:&#39;; 
	fastcgi_finish_request(); /* 响应完成, 关闭连接 */ 
	 
	/* 记录日志 */ 
	file_put_contents(&#39;log.txt&#39;, &#39;生存还是毁灭,这是个问题.&#39;); 
	
Copy after login

通过浏览器访问此脚本,结果发现并没有输出相应的字符串,但却生成了相应的文件.由此说明在调用fastcgi_finish_request后,客户端响应就已经结束,但与此同时服务端脚本却继续运行!

合理利用这个特性可以大大提升用户体验,趁热打铁再来一个例子:

<?php 
	 
	echo &#39;例子:&#39;; 
	 
	file_put_contents(&#39;log.txt&#39;, date(&#39;Y-m-d H:i:s&#39;) . " 上传视频n", FILE_APPEND);   
	 
	fastcgi_finish_request(); 
	 
	sleep(1); 
	file_put_contents(&#39;log.txt&#39;, date(&#39;Y-m-d H:i:s&#39;) . " 转换格式n", FILE_APPEND); 
	 
	sleep(1); 
	file_put_contents(&#39;log.txt&#39;, date(&#39;Y-m-d H:i:s&#39;) . " 提取图片n", FILE_APPEND); 
	 
	
Copy after login

代码里用sleep模拟一些耗时的操作,浏览时没有被堵塞,程序却都执行了,具体看日志.

末了给您提个醒,Yahoo在Best Practices for Speeding Up Your Web Site中提到了Flush the Buffer Early,也就是利用PHP中的flush方法把内容尽快发到客户端去,它和本文介绍的fastcgi_finish_request有些许的类似.

另外,从代码的可移植性讲的话,可以在代码中附上如下代码:

if (!function_exists("fastcgi_finish_request")) { 
	 function fastcgi_finish_request() { 
	 } 
}
Copy after login

不会造成代码部署在非fpm环境下造成问题.


文章网址:

随意转载^^但请附上教程地址。

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Recommendations
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template