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

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

WBOY
WBOYOriginal
2016-05-26 08:19:551763Durchsuche

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;); 
	

通过浏览器访问此脚本,结果发现并没有输出相应的字符串,但却生成了相应的文件.由此说明在调用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); 
	 
	

代码里用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() { 
	 } 
}

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


文章网址:

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

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn