用户在访问一个web服务的时候,可能几毫秒就完成,也可能几分钟都完不成。如果程序执行缓慢,用户可能没有耐心等下去,就关闭浏览器了。
而有的时候,我们根本不关心这些耗时的脚本的返回结果,但却还要等他执行完返回,才能继续下一步。
那么有没有什么办法,只是简单的触发调用这些耗时的脚本然后就继续下一步,让这些耗时的脚本在服务端慢慢执行?
这里分享一个办法,提高页面响应,提升用户体验
<?php
function step1()
{
sleep(1);
}
function step2()
{
sleep(5);
file_put_contents('filename.txt', '耗时任务已完成');
}
/**
* 结束输出缓冲数据
* @return [type] [description]
*/
function finishRequest(){
ignore_user_abort(true); // 客户端关闭程序继续执行
if(function_exists('fastcgi_finish_request')) {
fastcgi_finish_request(); // 响应完成, 关闭连接。只在FastCGI有效
} else {
header('X-Accel-Buffering: no'); // nginx 不缓存输出
header('Content-Length: '. strlen(ob_get_contents()));
header("Connection: close");
header("HTTP/1.1 200 OK");
ob_end_flush();
flush();
}
}
step1();
echo "您的请求已完成";
finishRequest();
step2();
我们在处理step1逻辑的时候,主要任务就一完成。这时我可以先把结果返回给浏览器,告诉用户已完成。后面我继续处理耗时任务。
而不用等step2耗时任务处理完才告诉用户。提升用户体验
这里主要用利用php的缓存数据输出,将返回的数据提前返回到浏览器。