Php 为什么在for循环完全处理后出现进度条

Php 为什么在for循环完全处理后出现进度条,php,javascript,Php,Javascript,以下是我的脚本,我在其中放置了进度条,以告知用户正在处理的图纸数据的进度问题是,在将xls保存到csv的整个过程完成后,进度条会出现。请告诉我如何修改以下内容,以便在当前图纸被保存时,进度条会正确显示在程序上。谢谢 $excel = new Spreadsheet_Excel_Reader(); $excel->setOutputEncoding('UTF-16'); $excel->read('Student2.xls'); $x=1; $sep

以下是我的脚本,我在其中放置了进度条,以告知用户正在处理的图纸数据的进度问题是,在将xls保存到csv的整个过程完成后,进度条会出现。请告诉我如何修改以下内容,以便在当前图纸被保存时,进度条会正确显示在程序上。谢谢

 $excel = new Spreadsheet_Excel_Reader();
    $excel->setOutputEncoding('UTF-16');
    $excel->read('Student2.xls');
    $x=1;
    $sep = ",";

   $nbSheets = count($excel->sheets);
  echo $x." -  ".$nbSheets;

  $total = $nbSheets - 1;

for($i = 0; $i < $nbSheets; $i++) {


    // Calculate the percentation
    $percent = intval($i/$total * 100)."%";

    // Javascript for updating the progress bar and information
    echo '<script language="javascript">
    document.getElementById("progress").innerHTML="<div style=\"width:'.$percent.';background-color:#ddd;\">&nbsp;</div>";
    document.getElementById("information").innerHTML="'.$i.' row(s) processed.";
    </script>';

    // This is for the buffer achieve the minimum size in order to flush data
    echo str_repeat(' ',1024*64);

    // Send output to browser immediately
    flush();
    //sleep(1);

   ob_start();
    while($x<=$excel->sheets[$i]['numRows']) {
        $y=1;
        $row="";
        while($y<=$excel->sheets[$i]['numCols']) {
            $cell = isset($excel->sheets[$i]['cells'][$x][$y]) ? $excel->sheets[$i]['cells'][$x][$y] : '';
            $row.=($row=="")?"\"".$cell."\"":"".$sep."\"".$cell."\"";
            $y++;
        } 
        echo $row."\n"; 
        $x++;
    }
    $x = 1; $y = 1;
    $fp = fopen("data.csv",'a');
    fwrite($fp,ob_get_contents());
    fclose($fp);
    ob_end_clean();

}

echo "CSV file created successfully";
// Tell user that the process is completed
echo '<script language="javascript">document.getElementById("information").innerHTML="Process completed"</script>';

也许这可以解决你的问题:


另外,为什么要使用输出缓冲区写入data.csv文件?正如上面所说,输出缓冲区用于输出数据,因此在这种情况下,我认为在fwrite函数中传递$row.\n更符合逻辑。如果我在这里遗漏了什么,请纠正我。

您需要使用AJAX或客户机-服务器通信框架来实现这一点

您可以尝试通过文章底部附近的链接下载代码

并且似乎解决了一个类似的问题


尽管我很不愿意这么说,但搜索ajax php progressbar可能会带来大量示例。

我查看了您的代码和您提到的链接。您的代码中有一个区别,区别在于您已经对sleep1;,由于只有这个命令,您无法正确地看到工作进度条


因此,请取消这一沉睡1的注释;您的代码将正常工作。

为此,您必须使用AJAX。@YogeshSuthar请看一看这个正在工作的示例。请不要使用language=javascript。这是无效的。我提到的上面的链接包含与上面相同的for循环,唯一的区别是上面的代码包含转储数据的脚本,而我提到的链接没有。不!!在我的情况下没有更多的工作,我不能在fwrite中使用,因为我没有得到单行。哦,是我的错误,您需要创建另一个名为$rows的变量,其中您有$rows。=$row。\n;而不是echo$行。\n;我想,在没有输出缓冲区的情况下,它应该可以工作。好吧,我又遇到了一个麻烦,一个更复杂的问题。不管我在for循环的代码之前提到了什么,它都是先运行的。严重原因:-?我使用了并且alerthi偶数hi在for循环执行后出现为什么..我使用并且alerthi偶数hi在for循环执行后出现为什么。。