`
zhengdl126
  • 浏览: 2543094 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

神奇的Fastcgi_Finish_Request

    博客分类:
  • php
 
阅读更多

当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有些许的类似,但本质上完全不同,别混淆了。

 

 

 

 

 

---------------------------

 

echo jsonTrue();//客户端返回成功结果,后台进程继续执行
fastcgi_finish_request();
....
end();

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    php中神奇的fastcgi_finish_request

    在描述的示例中,我们可以看到,当`fastcgi_finish_request`被调用后,浏览器接收到的第一个字符串"例子:"是立即显示的,然而后续的"To be, or not to be, that is the question."并没有被浏览器接收到,因为`...

    fastcgi 数据发送,跳转 实例

    fastcgi_finish_request(); // 后台耗时操作 sleep(5); echo '后台任务完成。'; // 这部分客户端是看不到的 ?&gt; ``` 上述代码中,"开始处理..."会被立即发送给浏览器,而"后台任务完成。"则会在后台处理完成后输出,...

    在请求中尽可能晚地执行耗时的任务-PHP开发

    在执行任务之前使用fastcgi_finish_request()来完成请求的示例&lt;?php Procrastinator for PHP:稍后做的事情一些类可帮助您稍后执行复杂的任务(例如发送邮件)。 在执行任务之前使用fastcgi_finish_request...

    php-fpm中文文档.pdf

    14. 通过PHP-FPM,可以设置REQUEST_BODY_FILE等fastcgi_param,来处理通过POST方法接收的请求体数据。 15. PHP-FPM对PHP 4和PHP 5的支持是有差异的,其中PHP 5增强了对graceful restarts的支持。 16. PHP-FPM可以...

    简单介绍PHP非阻塞模式

    在示例代码中,"program start."会被立即发送到浏览器,而"debug..."由于在`fastcgi_finish_request()`之后,浏览器无法接收到。 2. **非阻塞的网络I/O操作**: 使用`fsockopen`或`cUrl`的非阻塞模式可以发起异步...

    Async-Transients:提供陈旧数据的瞬态,同时在后台重新生成新的瞬态

    要求需要支持fastcgi_finish_request ,否则瞬态将立即重新生成过期数据。安装该库旨在包含在作曲家中。 要安装,请运行composer require 10up/async-transients 。 该库设置为使用 composer 的自动加载器,因此请...

    php+apc上传进度条

    APC的进度条功能在PHP 5.x版本中可用,但在PHP 7.x中已经被弃用,建议转向使用`sysvmsg`、`session`或者其他更现代的解决方案,如`php-fpm`的`fastcgi_finish_request`和`nginx`的`proxy_pass_request_body Off`配合...

    PHP 5.6.31

    Fixed bug #73807 (Performance problem with processing post request over 2000000 chars). Fixed bug #74111 (Heap buffer overread (READ: 1) finish_nested_data from unserialize). Fixed bug #74603 ...

    java多线程tcpsocketserver源码-libfcgi:fastCGIClib(来自fastcgi.com,由hoshino为win

    request.finish(); } }); server.start(); } } ``` 在这个例子中,`handleRequest`方法接收FastCGI请求,并生成相应的响应。`FCGIServer`监听8000端口,当收到FastCGI请求时,会调用注册的处理器。 总结,...

    php swoole异步任务实现代码(包括服务器端、客户端).rar

    这通常涉及到`task_worker_num`、`task_max_request`等相关配置和`$server-&gt;task`、`$server-&gt;finish`方法的使用。 4. 长连接:Swoole支持与客户端建立长连接,可以实现高效的数据推送和服务端主动向客户端发送消息...

Global site tag (gtag.js) - Google Analytics