PHP中,在客户端发出请求触发脚本执行,然后在服务器端执行一段代码,页面关闭了也要继续执行,并且要先返回一些状态给客户端,避免前端等待超时。
/**************** 1 返回给前端结果之前的操作 ****************/ /**************** 2
告诉前端结果,告诉浏览器操作成功,但继续运行php ****************/ ob_end_clean(); ob_start();
//Windows服务器需要加上这行。 echo str_repeat(" ",4096);//windows // echo str_repeat(' ',
65536); //linux
//-----------------------------------------------------------------------------------
_ajaxReturntwo(200,'操作成功');//返回结果给ajax
//-----------------------------------------------------------------------------------
$size = ob_get_length(); header("Content-Length: ".$size); 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")) { //
yii或yaf默认不会立即输出,加上此句即可(前提是用的fpm) fastcgi_finish_request(); // 响应完成,
立即返回到前端,关闭连接 } ignore_user_abort(true);//在关闭连接后,继续运行php脚本 set_time_limit(0);
//no time limit,不设置超时时间(根据实际情况使用) /**************** 2 告诉前端结果,告诉浏览器完成,但继续运行php
****************/ /**************** 3 继续运行php ****************/ sleep(20); /*
休眠PHP,也就是当前PHP代码的执行停止,20秒钟后PHP被唤醒, PHP唤醒后,继续执行下面的代码,但这个时候上面代码的结果已经输出浏览器了,
也就是浏览器从HTTP头中知道了服务端关闭了连接,浏览器将不在等待服务器的响应,
反应给客户的就是页面不会显示处于加载状态,换句话说用户可以关掉当前页面,或者关掉浏览器, PHP唤醒后继续执行下面的代码,这也就实现了PHP后台执行的效果,
休眠的作用只是让php先把前面的输出作完,不要急于马上执行下面的代码,休息一下而已,也就是说下面的代码 执行的时候前面的输出应该到达浏览器了 */
.......继续写功能的逻辑 function _ajaxReturntwo($code, $msg, $data=array()) { $data =
is_null($data) ? array() : $data; $data = array( "code" => $code, "msg" =>
$msg, "data" => json_encode($data) );
header('Cache-Control:no-cache,must-revalidate'); header('Pragma:no-cache');
header('Content-Type:application/json; charset=utf-8');
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers:x-requested-with,content-type"); echo
json_encode($data); }