php中神奇的fastcgi_finish_request

品类中直接有用到fastcgi_finish_request,感觉很实用。

品类中一直有用到fastcgi_finish_request,感觉很实用。

当PHP运行在法斯特CGI格局时,PHP
FPM提供了贰个名为fastcgi_finish_request的方法.依照文档上的说教,此形式可以增进请求的处理速度,假设稍微处理可以在页素不相识成完后再开展,就足以利用这几个方法.

听起来大概有点不解,大家因此多少个例证来说雅培下:

用法:

用法:

php中神奇的fastcgi_finish_request。听起来或许某些茫然,大家通过多少个例子来证圣元下:

复制代码 代码如下:

if(function_exists(‘fastcgi_finish_request’))
fastcgi_finish_request();

if(function_exists(‘fastcgi_finish_request’))
fastcgi_finish_request();

 代码如下

<?php
echo ‘例子:’;
fastcgi_finish_request();
echo ‘To be, or not to be, that is the question.’;
file_put_contents(‘log.txt’, ‘生存照旧毁灭,那是个难点。’);
?>

只要代码运转到这些职位,就早已断开请求重回参数给客户端了。
接下来的代码都和客户端从未关联了。(在加总结功用的时候就很有利,不影响业务端)

如果代码运营到这么些地点,就早已断开请求再次来到参数给客户端了。
接下来的代码都和客户端从未涉及了。(在加统计功用的时候就很方便,不影响业务端)

<?php
 
echo ‘例子:’;
fastcgi_finish_request(); /* 响应做到, 关闭连接 */
 
/* 记录日志 */
file_put_contents(‘log.txt’, ‘生存还是毁灭,那是个难点.’);
?>

因而浏览器(不是命令行!)运营此脚本,结果发现并不曾出口相应的字符串,但却生成了相应的公文。因此表明在调用fastcgi_finish_request后,客户端响应就曾经完成,但与此同时服务端脚本却继续运营!
理所当然运用那么些天质量够大大进步用户体验,一气呵成再来二个例子:

代码执行稍久的都要设定set_time_limit(0)

代码执行稍久的都要设定set_time_limit(0)

通过浏览器访问此脚本,
结果发现并不曾出口相应的字符串,但却生成了对应的文件.由此表明在调用fastcgi_finish_request后,客户端响应就已经终止,但与此同时服务端脚本却继续运营!

复制代码 代码如下:

在高并发下执行时间过久也会促成fastcgi进度不够用,不可以马上放出,就会爆502错误了。

在高并发下执行时间过久也会导致fastcgi进度不够用,不恐怕立刻放出,就会爆502错误了。

合理利用这么些特点可以大大升级用户体验,一气呵成再来三个例子:

<?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模拟一些耗时的操作,浏览时未尝被堵塞,程序却都履行了,具体看日志。

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

最终给您提个醒,Yahoo在Best Practices for Speeding Up Your Web
Site中关系了Flush
the Buffer
Early,也等于利用PHP中的flush格局把内容尽快发到客户端去,即便表面上它和本文介绍的fastcgi_finish_request有多少的近乎,但实质上完全差异,别模糊了。

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

转发附言: 小编看了下这一个点子, 在调用的时候, 会发送响应, 关闭连接.
不过不会终止PHP的运维. 相比较调用flush, 只怕本人事先介绍的加快你的Echo来说,
那几个方法能更进一步干脆一些.

最后给您提个醒,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() { }
}

if (!function_exists(“fastcgi_finish_request”)) {
      function fastcgi_finish_request() {
      }
}

不会导致代码安插在非fpm环境下促成难点.

不会造成代码计划在非fpm环境下促成难题.

您只怕感兴趣的稿子:

  • php.ini中的request_order推荐设置
  • php实现httpRequest的方法
  • php中time()与$_SERVER[REQUEST_TIME]用法分别
  • php中使用$_REQUEST须求小心的二个标题
  • php中$_REQUEST、$_POST、$_GET的区分和关联小结
  • php错误提醒failed to open stream: HTTP request
    failed!的一应俱全消除办法
  • PHP 中TP5 Request
    请求对象的实例详解

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website