作者在项目开发中,遇到一个问题:
前端通过 Ajax 请求后台 PHP API 接口,执行完成操作以后,需要通过短信通知用户,因为发送消息会占用大量时间,如果等到消息发送完成后返回结果给客户端的话,会浪费大量时间。那么我们就需要先给客户端一个结果然后再异步发送消息。
*解决方法:
第一种方法,先给用户返回结果,然后在页面重新使用ajax异步请求脚本执行剩下的程序。此方法缺陷是可能还没有执行到请求,客户端就关闭了。
第二种方法,使用curl扩展,设置超时为一秒,请求脚本一秒后断开,脚本还是在执行的队列中。
第三种方法,ob函数,fastcgi_finish_request函数,ignore_user_abort函数,实现代码如下:
<?php
//这里执行必要的程序代码
ob_start();
echo 'success'; //输出执行的结果
$size_o = ob_get_length();
header("Content-Length: $size_o");
header('Connection: close');
header("HTTP/1.1 200 OK");
header("Content-Type: application/json;charset=utf-8");
ob_end_flush();
if(ob_get_length())
{
ob_flush();
flush();
}
if (function_exists("fastcgi_finish_request")) {
fastcgi_finish_request();
}
ignore_user_abort(true);
set_time_limit(10);
//以下执行耗时并且不影响结果的程序(请记录日志) 万一没有执行成功需要二次执行
?>
此方法缺陷是如果程序卡死的话,那么php进程会阻塞,所以耗时任务需要谨慎处理。