数据载入中,请稍后......
 
展开
懒人码库客户端 点击或扫描下载
欢迎来到懒人码库!懒人码库QQ群:19651313
欢迎来到懒人码库!懒人码库QQ群:19651313  
当前位置:懒人码库 > 服务端脚本 > PHP

用 IGNORE_USER_ABORT 实现 PHP 驻留运行程序(后台运行)

2017-08-20 23:41 来源:www.lanrenmaku.com / 作者:懒人 已被阅读:次 分类:PHP 上一篇:php微信推送消息简单例子_客服接口-发消息 下一篇:php如果执行一个死循环及后台自动执行

前言

这是一个“人之常情”的实际使用场景。

有时候我们请求一个 php 页面,但是这个页面执行的任务的确没个三五分钟跑不出来,这怎么办?

我们可以让这个任务一直在跑,即使用户关掉了页面。

进一步,我们可以让任务一直跑,但是先向用户返回一个正常的 http 响应。

下面我们来写这两个例子:

让任务驻留,用户关闭窗口继续运行

ignore_user_abort(true); // 后台运行  set_time_limit(0); // 取消脚本运行时间的超时上限 

让任务驻留,并且向客户端返回响应

ob_end_clean(); // 清除之前的缓冲内容,这是必需的,如果之前的 buffer 不为空的话,里面可能有http头或者其它内容,导致后面的内容不能及时的输出  header("Connection: close"); // 告诉浏览器,连接关闭了,这样浏览器就不用等待服务器的响应  header("HTTP/1.1 200 OK"); //可以发送200状态码,以这些请求是成功的,要不然可能浏览器会重试,特别是有代理的情况下   ob_start();#开始当前代码缓冲  echo "running,,,,."; // 下面输出http的一些头信息  $size=ob_get_length();  header("Content-Length: $size");  ob_end_flush(); // 输出当前缓冲  flush(); // 输出PHP缓冲   // 休眠PHP,也就是当前PHP代码的执行停止,1秒钟后PHP被唤醒,  // PHP唤醒后,继续执行下面的代码,但这个时候上面代码的结果已经输出浏览器了,  // 也就是浏览器从HTTP头中知道了服务端关闭了连接,浏览器将不在等待服务器的响应,  // 反应给客户的就是页面不会显示处于加载状态中,换句话说用户可以关掉当前页面,或者关掉浏览器,  // PHP唤醒后继续执行下面的代码,这也就实现了PHP后台执行的效果,  // 休眠的作用只是让php先把前面的输出作完,不要急于马上执行下面的代码,休息一下而已,也就是说下面的代码  // 执行的时候前面的输出应该到达浏览器了  sleep(1);  echo '这里的输出用户看不到,后台运行的';   //下面代码的任何输出都不会输出给浏览器,因为http连接已经关了,  //所以下面的代码的执行属于后台运行的  ignore_user_abort(true); // 后台运行,这个只是运行浏览器关闭,并不是直接就中止返回200状态。  set_time_limit(0); // 取消脚本运行时间的超时上限   // 从这里开始做你想做的事 

最后自己先放一个真正靠谱的:

<?php  ob_end_flush();  ob_start();  set_time_limit(0);  ignore_user_abort(true);  //header("Location: http://www.baidu.com/");  //header("HTTP/1.1 200 OK");  header("Content-Length: 0");  echo str_repeat(" ", 4096*1024);  ob_flush();  flush();  sleep(5);    // .... 

参考:http://www.cnblogs.com/zdz8207/p/3765567.html

 

小贴士:懒人码库 为网页前端人员提供建站常用的广告代码和网页特效,内容涵盖焦点图,导航菜单,jQuery代码,图片特效,对联广告,日历控件,在线客服等。