php实现客户端连接断开后仍继续执行后续代码

作者在项目开发中,遇到一个问题:

前端通过 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进程会阻塞,所以耗时任务需要谨慎处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值