使用fastcgi_finish_request 处理耗时的任务_扶摇网络

我们只做利于SEO的网站

使用fastcgi_finish_request 处理耗时的任务

来源:扶摇网络 作者:网站建设/SEO优化专家 浏览: 发布日期:2021-04-27 19:21:47
[导读]:我们业务中经常遇到这样的场景:比如生成文件较大的excel ,非常耗时,有可能需要5到30妙的时间,甚至更长导致浏览器连接超时。另外一个就是体验问题,用户需要长时间的等待响应的完毕,体验较差。类似的场景还有1:需要处理大的文件2:发送邮件或短信,尤其是需要循环发送邮件通知等3:调用远程耗时的api 等遇到这种情况,如果您的服务器使用的也是nginx ,那么可...

我们业务中经常遇到这样的场景:比如生成文件较大的excel ,非常耗时,有可能需要5到30妙的时间,甚至更长导致浏览器连接超时。

另外一个就是体验问题,用户需要长时间的等待响应的完毕,体验较差。

类似的场景还有

1:需要处理大的文件

2:发送邮件或短信,尤其是需要循环发送邮件通知等

3:调用远程耗时的api 等


遇到这种情况,如果您的服务器使用的也是nginx ,那么可以考虑使用下面的函数


fastcgi_finish_request();

该函数的作用:

理解发送响应给浏览器,这样用户的等待时间很短,但是php进程其实还在服务器中运行。

这样就达到了两个目录目的,有点类似于异步任务


响应快:比如发送邮件需要3秒时间,但用户无感知,1妙之内就告诉用户发送邮件完毕

耗时任务后台执行:浏览器响应结束了,用户可以做其他的事情。后台进程默默的执行发送邮件等任务

举例效果图:

1:该程序模拟一个耗时的任务,需要5妙才能执行完毕


经过上面的演示,我们达到了目的

1:很快的响应,1毫米之内,浏览器响应结束

2:后台任务,注意右侧上方的日志,每秒输出一个时间戳


全部测试代码如下

 

/**

 * 设置超时时间,变成不限制

 *

 */

set_time_limit(0);


/**

 * 本函数模拟非常耗时的任务,执行完毕需要5秒的时间

 */

 function writeFile()

 {

     $path = '/home/ndw/test/1.txt';

     file_put_contents($path,'程序运行开始' . PHP_EOL,FILE_APPEND);

     for($i =0;$i < 5;$i++) {

         file_put_contents($path,time() . PHP_EOL,FILE_APPEND);

         sleep(1);

     }


     file_put_contents($path,'程序运行结束' . PHP_EOL,FILE_APPEND);


 }


/**

 * 输出文字标记,任务开始

 */

echo('任务开始');


/**

 *  后台执行非常耗时的任务

 */

register_shutdown_function(writeFile);


/**

 * 立即发送请求

 */

fastcgi_finish_request();

备注:


主角是fastcgi_finish_request,其实把要执行的代码放到该函数的后面,就可以了。

register_shutdown_function函数,具体百度,这个函数主要是为了考虑修改成本,有的程序已经成型,不方便作大的调整,可以把函数提前注册,这样他是不会立即执行的。页面响应完毕后,再调用本函数

建议不要滥用,适合一些耗时但流程简单的任务(比如发送邮件)。因为是后台执行,如果程序出错,前台是看不到的,需要有日志记录和重试机制。


大家有疑问,可以在下边留言交流,我有空会及时回复,本人英文网名:Cheng,中文网名:陆小凤。
免责声明:本文由专注多年品牌设计公司扶摇网络整理编写,旨在为企业提供网络知识分享,如有侵权请联系删除,转栽请注明出处.
加载中~
微信咨询网站建设

扫一扫高效沟通

访问网站建设手机端

扫描访问手机网站

多一份参考总有益处

免费领取网站策划SEO优化策划方案

请填写下方表单,我们会尽快与您联系
感谢您的咨询,我们会尽快给您回复!