智一面上的php面试题分享给大家

面试题:php如何实现程序异步执行,对非阻塞的理解?

答:

1. fastcgi_finish_request ,register_shutdown_function 可以简单实现处理耗时任务

2. 利用swoole,workman框架实现,场景消息队列,多线程,协程

我们业务中经常遇到这样的场景:比如生成文件较大的excel ,非常耗时,有可能需要5到30妙的时间,甚至更长导致浏览器连接超时。
另外一个就是体验问题,用户需要长时间的等待响应的完毕,体验较差。
类似的场景还有
1:需要处理大的文件
2:发送邮件或短信,尤其是需要循环发送邮件通知等
3:调用远程耗时的api 等

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

fastcgi_finish_request();

该函数的作用:
理解发送响应给浏览器,这样用户的等待时间很短,但是php进程其实还在服务器中运行。
这样就达到了两个目录目的,有点类似于异步任务

响应快:比如发送邮件需要3秒时间,但用户无感知,1妙之内就告诉用户发送邮件完毕
耗时任务后台执行:浏览器响应结束了,用户可以做其他的事情。后台进程默默的执行发送邮件等任务

全部测试代码如下

<?php
/**
 * 设置超时时间,变成不限制
 *
 */
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函数,具体百度,这个函数主要是为了考虑修改成本,有的程序已经成型,不方便作大的调整,可以把函数提前注册,这样他是不会立即执行的。页面响应完毕后,再调用本函数
建议不要滥用,适合一些耗时但流程简单的任务(比如发送邮件)。因为是后台执行,如果程序出错,前台是看不到的,需要有日志记录和重试机制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值