PHP+JavaScript 实现动态显示服务器端运行进度条(酷

来源:http://www.sh-fengwen.com 作者: 营养排行 人气:138 发布时间:2019-09-03
摘要:我有一个 PHP 程序,需要循环调用 XMLRPC 500 次左右,运行20多分钟。当程序运行的时候,客户端只有一片空白的页面,浏览器的状态一直是load。作为用户来说,这种等待是漫长的,埋怨

我有一个 PHP 程序,需要循环调用 XMLRPC 500 次左右,运行 20 多分钟。当程序运行的时候,客户端只有一片空白的页面,浏览器的状态一直是 load。作为用户来说,这种等待是漫长的,埋怨也就多了。
解决思路
如果有个进度条呈现在用户面前,告诉用户服务器端正在干嘛,当前运行了多少,问题就可以得到基本解决,虽然没有减少服务器端的运行时间,但用户的心里会有微妙的变化,感觉不再是枯燥无味的等待,至少等待还有个盼头 :) 。
考虑到每一次调用 XMLRPC 比较耗时,所以可以在每一次调用时使用 PHP 的 flush() 函数输出一段 JavaScript 对客户端浏览器中进度条显示进行动态更新。
代码注解
进度条的 HTML 代码:

对于有很多流程的东西,我们希望能够根据不同的阶段,用流程条对应地进行显示,如下所示:

Code:

px">
 如下进度条的动态效果由服务器端 PHP 程序结合客户端 JavaScript 程序生成。
 px">
     
 
 
 0%

图片 1

利用 div 的背景色作为进度条。
客户端 JavaScript 函数 updateProgress(sMsg, iWidth),此函数用于更新进度条

以上功能对应的html代码如下:

Code:


<div class="col-md-12 col-lg-3"> 
   <div class="panel panel-default"> 
    <div class="tit06"> 
     <h3>漏洞处理状态</h3> 
    </div> 
    <div class="status"> 
     <ul> 
      <li name="__tab_step1_pub" class="top active"> 
        <div class="info" id="tab_step1"> 
        <h4> 
         <div class="heading"></div> 
         待审阅</h4> 
        <p class="text" >漏洞已提交,等待厂商审阅</p>  
        </div> 
      </li> 
      <li name="__tab_step2_pub" > 
        <div class="info" id="tab_step2"> 
        <h4> 
         <div class="heading"></div> 
         待确认</h4> 
        <p class="text" >漏洞已开始审阅,等待厂商确认</p> 
        </div> 
      </li> 
      <li name="__tab_step3_pub"> 
       <div class="info" id="tab_step3"> 
        <h4> 
         <div class="heading"></div> 
         待修复</h4> 
         <p class="text" >漏洞已被确认,等待厂商修复</p>   
       </div> 
      </li> 
      <li name="__tab_step4_pub"> 
        <div class="info" id="tab_step4"> 
        <h4> 
         <div class="heading"></div> 
         已关闭</h4> 
          <p class="text" >漏洞修复完毕,厂商关闭漏洞</p> 
        </div> 
      </li> 
      <li name="__tab_step5_pub" > 
        <div class="info" id="tab_step5"> 
        <h4> <div class="heading"></div> 
         已公开</h4> 
        <p class="text" >厂商同意公开此漏洞</p> 
        </div> 
      </li> 
     </ul> 
    </div> 
   </div> 
  </div> 

参数 sMsg 为 status 中显示的状态文字,而 iWidth 参数则为当前进度条的长度,此值以及进度条的最大长度 $width 均由服务器端计算出来。
每次调用耗时操作时,均使用 PHP 的 flush() 函数输出一段 JavaScript 代码:

这里采用的方法是根据处理的状态,这里是$status,对应的在相应的<li>的标签中增加样式类 class="active",而样式类active中实现的是在对应位置替换背景图片,即将原来的灰色流程线条替换成绿色的流程线条。即需要设置对应的替换后和替换前的css,这里对应的css如下(assetsdefaultthreatrulesstyle.css中的一部分):

Code:



.status ul { padding: 15px; } 
.status ul li { overflow: hidden; background: url("../threatrules/steps-line.jpg") repeat-y -3px 0px; padding: 26px 0 0px; } 
.status .active { background: url("../threatrules/steps-line-over.jpg") repeat-y -3px 0px; } 
.status .end { background: url("../threatrules/steps-line-over.jpg") repeat-y -3px 0px; } 
.status .end .heading { background: url("../threatrules/steps-over.jpg") no-repeat 0px 0px; } 
.status .bottom { background: url("../threatrules/steps-line.jpg") repeat-y -3px 0px; } 
.status .skip { background: url("../threatrules/steps-line-skip.jpg") repeat-y -3px 0px; } 
.status .skip .heading { background: url("../threatrules/steps-skip.jpg") no-repeat 0px 0px; } 
.status .active .heading { background: url("../threatrules/steps-over.jpg") no-repeat 0px 0px; } 
.status .heading { float: left; width: 20px; height: 20px; background: url("../threatrules/steps.jpg") no-repeat 0px 0px; margin-right: 5px; } 
.status .top { padding-top: 0px; } 
.status .bottom { background: url("../threatrules/steps-line-b1.jpg") no-repeat 0px 0px; } 
.status .bottom-active { background: url("../threatrules/steps-line-b2.jpg") no-repeat 0px 0px; } 
Code:


if ('source' == $_GET['act']) {    //查看源代码
 show_source($_SERVER["SCRIPT_FILENAME"]);
 exit;
}   //end if
set_time_limit(0);
for ($i = 0; $i < 500; $i++) {
 $users[] = 'Tom_' . $i;
}   //end for
$width = 500;   //显示的进度条长度,单位 px
$total = count($users); //总共需要操作的记录数
$pix = $width / $total; //每条记录的操作所占的进度条单位长度
$progress = 0;  //当前进度条长度
?>
http://www.w3.org/TR/xhtml1/DTD/transitional.dtd">


  动态显示服务器运行程序的进度条
 
 
 
 
 body, div input { font-family: Tahoma; font-size: 9pt }
 
     


px">
 如下进度条的动态效果由服务器端 PHP 程序结合客户端 JavaScript 程序生成。
 px">
                 
 
  
 0%


flush();    //将输出发送给客户端浏览器
foreach ($users as $user) {
 //  在此处使用空循环模拟较为耗时的操作,实际应用中需将其替换;
 //  如果你的操作不耗时,我想你就没必要使用这个脚本了 :)
 for ($i = 0; $i < 10000; $i++) {
     ;;
  }
?>


 flush();    //将输出发送给客户端浏览器,使其可以立即执行服务器端输出的 JavaScript 程序。
 $progress += $pix;    
}   //end foreach
//  最后将进度条设置成最大值 $width,同时显示操作完成
?>


flush();
?>



设置好对应的css后,下一步就是编写js,根据$status的值,在对应的<li>中添加class即可,实现此功能的js代码如下:

PHP 程序,需要循环调用 XMLRPC 500 次左右,运行 20 多分钟。当程序运行的时候,客户端只有一片空白的页面,浏览器的状态一直是...

<script type="text/javascript"> 
/*根据处理状态,添加或删除对应的样式名*/ 
function addClass(elem, className){ //增加类名 
  if(!elem.className){ 
      elem.className = className; 
      return; 
  } 
  var clazz = ' ' + elem.className + ' '; 
  if(clazz.indexOf(' ' + className + ' ') === -1){ 
      elem.className = elem.className + ' ' + className; 
  } 
} 
 var step1 = document.getElementById('tab_step1'), 
   step2 = document.getElementById('tab_step2'), 
   step3 = document.getElementById('tab_step3') , 
   step4 = document.getElementById('tab_step4'), 
   step5 = document.getElementById('tab_step5'); 
 var status = '<?php echo $status;?>'; 
 switch(status){ 
   case '1': //待确认 
     addClass(step2.parentNode, 'active'); //parentNode即为包含step2的外一层标签,此处即为<li>标签 
     break; 
   case '2': //待修复 
      addClass(step2.parentNode, 'active'); 
      addClass(step3.parentNode, 'active'); 
     break; 
   case '3'://已关闭 
     addClass(step2.parentNode, 'active'); 
     addClass(step3.parentNode, 'active'); 
     addClass(step4.parentNode, 'active'); 
     break; 
   case '4': //已公开 
     addClass(step2.parentNode, 'active'); 
     addClass(step3.parentNode, 'active'); 
     addClass(step4.parentNode, 'active'); 
     addClass(step5.parentNode, 'end bottom-active'); 
     break; 
 } 
</script> 

本文由美高梅游戏平台网站发布于 营养排行,转载请注明出处:PHP+JavaScript 实现动态显示服务器端运行进度条(酷

关键词:

最火资讯