除非使用sleep(),否则PHP进度跟踪在foreach循环中无法正常工作

时间:2017-11-21 16:21:16

标签: javascript php jquery ajax

我有一个小的PHP函数,我用它来跟踪php执行进度。将进度放入txt文件中,并使用js函数每0.1秒检索一次。

现在的问题是,如果我在循环中使用sleep(1);,进度条只会更新,尽管refreshProgress()函数在执行php脚本期间运行了大约40次,这超过了足以将数据保存在12个循环的txt文件中。

同样通过在保存后回显文件内容我可以看到正确保存百分比,所以我不确定问题出在哪里,我肯定不想使用睡眠功能,因为我将运行稍后大量数据的脚本。

这里有2张图片来说明使用sleep(1)和不使用sleep时的区别 using sleep(1) Not using sleep() 这是PHP脚本:

$cars = array
      (
      array("Volvo",22,18),
      array("BMW",15,13),
      array("Saab",5,2),
      array("Land Rover",17,15)
      );

$cars_all_count = 13;
$file = "to/this/path/progress.txt";
$i = 0; 

foreach ($cars as $key=>$carslist){
// some function
    foreach($carslist as $single_car){

    $start = microtime(true);
    $i++;

    // usleep(250000);

    UpdateProgress( $file, $i, $cars_all_count );

    $time_elapsed_secs = microtime(true) - $start;
    echo '<pre>loop:'.$i.'<br>';
    print_r($time_elapsed_secs);
    echo '<pre>';

    }
}

function UpdateProgress( $file, $i, $cars_all_count ) {
    // Calculate the percentatage.
    $percent = intval($i/$cars_all_count * 100);
    // Put the progress percentage and message to array.
    $arr_content = $percent;
    // Write the progress into a file
    file_put_contents($file, $arr_content);
    echo file_get_contents($file).'<br>';
}

我用来刷新进度的js函数:

function refreshProgress() {
    var progress_url = progress_file_link;

    jQuery.get(progress_url, function(response) {
         console.log(response);
        if (response.length == 0){
            return false;
        }
        var parsedData = response;
        jQuery("#progress").find('.bar').css('width', parsedData + '%');

        // console.log(parsedData);
        // If the process is completed, we should stop the checking process.
        if (parsedData == 100) {
            window.clearInterval(timer);
            completed();
        }
    });
}

0 个答案:

没有答案