用户在访问一个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的缓存数据输出,将返回的数据提前返回到浏览器。