Home  >  Article  >  Backend Development  >  What is the method to implement progress bar in php

What is the method to implement progress bar in php

王林
王林Original
2020-11-06 15:09:432663browse

The method for php to implement the progress bar is: 1. Use ajax to request the address of the logical processing; 2. During the logical processing, use the session to save the processing progress; 3. Use ajax to request another address for querying the progress. , thereby achieving real-time feedback.

What is the method to implement progress bar in php

There are two main ways to implement the progress bar in php. One is to use "output buffer control" to directly output the progress bar, and the other is the ajax method.

(Learning video recommendation: java course)

First let’s talk about the “output buffer control” method:

This method mainly uses several functions of PHP Buffering function, this method can be run directly without changing the configuration file. The code is posted below:

<?php
set_time_limit(0);  //设置程序执行时间
ignore_user_abort(true);    //设置断开连接继续执行
header(&#39;X-Accel-Buffering: no&#39;);    //关闭buffer
header(&#39;Content-type: text/html;charset=utf-8&#39;);    //设置网页编码
ob_start(); //打开输出缓冲控制
echo str_repeat(&#39; &#39;,1024*4);    //字符填充
$width = 1000;
$html = &#39;<div style="margin:100px auto; padding: 8px; border: 1px solid gray; background: #EAEAEA; width: %upx"><div style="padding: 0; background-color: white; border: 1px solid navy; width: %upx"><div id="progress" style="padding: 0; background-color: #FFCC66; border: 0; width: 0px; text-align: center; height: 16px"></div></div><div id="msg" style="font-family: Tahoma; font-size: 9pt;">正在处理...</div><div id="percent" style="position: relative; top: -34px; text-align: center; font-weight: bold; font-size: 8pt">0%%</div></div>&#39;;
echo sprintf($html, $width+8, $width);
echo ob_get_clean();    //获取当前缓冲区内容并清除当前的输出缓冲
flush();   //刷新缓冲区的内容,输出
$length = 11;
for($i=0; $i<$length; $i++) {
    sleep(rand(1,2));
    $proportion = ($i+1)/$length;
    if($i+1 == $length){
        $msg = &#39;同步完成&#39;;
    }else{
        $msg = &#39;正在同步第&#39; . ($i+1) . &#39;个用户&#39;;
    }
    $script = &#39;<script>document.getElementById("percent").innerText="%u%%";document.getElementById("progress").style.width="%upx";document.getElementById("msg").innerText="%s";</script>&#39;;
    echo sprintf($script, intval($proportion*100), intval(($i+1)/$length)*$width, $msg);
    echo ob_get_clean();    //获取当前缓冲区内容并清除当前的输出缓冲
    flush();   //刷新缓冲区的内容,输出
}

The "ajax method" is a little more troublesome. The logic of this method is to use ajax to request first (preferably It is the address of "logical processing" (asynchronous request). During the logical processing, use session or other storage media (such as memcache, redis, etc.) to save the processing progress, and use ajax to request (preferably a synchronous request) another address to query the progress. , to achieve real-time feedback.

The code is as follows:

First is the html file

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script type="text/javascript" src="./jquery-1.10.2.min.js"></script>
<title>同步</title>
</head>
<body>
    <input type="button" name="syn" id="syn" value="同步" />
    <div id="progressBar" style="margin: 50px auto; padding: 8px; border: 1px solid gray; background: #EAEAEA; width: 1008px;display:none">
        <div style="padding: 0; background-color: white; border: 1px solid navy; width: 1000px">
            <div id="progress" style="padding: 0; background-color: #FFCC66; border: 0; width: 0px; text-align: center; height: 16px"></div>
        </div>
        <div id="msg">正在处理...</div>
        <div id="percent" style="position: relative; top: -18px; text-align: center; font-weight: bold; font-size: 8pt">0%</div>
    </div>
</body>
<script>
function query(timestamp){
    $.ajax({
        type:&#39;post&#39;,
        url:&#39;/test1.php&#39;,   //查询进度
        data:{ timestamp:timestamp},
        dataType: "json",
        async:false,
        success: function(data){
            if(data.code==&#39;10000&#39;){
                data1 = data.data;
                document.getElementById("percent").innerText= data1.percent + "%";
                document.getElementById("progress").style.width=data1.progress + "px";
                document.getElementById("msg").innerText=data1.msg;
                if(data1.percent == 100){
                    $("#syn").attr(&#39;disabled&#39;, false);
                    return ;
                }
            }else{
                document.getElementById("msg").innerText=data.msg;
            }
            setTimeout(&#39;query(&#39; + timestamp + &#39;)&#39;, 1000);
        }
    });
}
$("#syn").click(function(){
    var timestamp = Date.parse(new Date());
    $("#syn").attr(&#39;disabled&#39;, &#39;disabled&#39;);
    $("#progressBar").css(&#39;display&#39;, &#39;block&#39;);
     $.ajax({
        type:&#39;post&#39;,
        url:&#39;/test.php&#39;,    //执行处理
        data:{ timestamp:timestamp},
        dataType: "json",
        async:true,
        success: function(data){
            if(data.code==&#39;10000&#39;){
                console.log(&#39;同步成功&#39;);
                //data1 = data.data;
                //document.getElementById("percent").innerText= data1.percent + "%";
                //document.getElementById("progress").style.width=data1.progress + "px";
                //document.getElementById("msg").innerText=data1.msg;
            }else{
                document.getElementById("msg").innerText=data1.msg;
            }
        }
    }); 
    setTimeout(&#39;query(&#39; + timestamp + &#39;)&#39;, 1000);
});
</script>
</html>

test.php file

<?php
set_time_limit(0);  //设置程序执行时间
ignore_user_abort(true);    //设置断开连接继续执行
$timestamp = $_POST[&#39;timestamp&#39;];   //省略一切校验
$width = 1000;
$length = 11;
for($i=0; $i<$length; $i++) {
    sleep(rand(1,2));    //模拟处理时间
    $proportion = ($i+1)/$length;
    if($i+1 == $length){
        $msg = &#39;同步完成&#39;;
    }else{
        $msg = &#39;正在同步第&#39; . ($i+1) . &#39;个用户&#39;;
    }
    $data = array(
        &#39;percent&#39; => intval($proportion*100),
        &#39;progress&#39; => intval($width*($i+1)/$length),
        &#39;msg&#39; => $msg
    );
    session_start();
    $_SESSION[&#39;now_percent&#39; . $timestamp] = $data;
    session_write_close();  //释放session锁
}
echo json_encode(array(
    &#39;code&#39; => 10000,
    &#39;data&#39; => $data
));

test1.php

<?php
//忽略所有校验,直接写主要部分
$timestamp = $_POST[&#39;timestamp&#39;];   //省略一切校验
session_start();
$now_percent = @$_SESSION[&#39;now_percent&#39; . $timestamp];
session_write_close();
if(empty($now_percent)){
    echo json_encode(array(
        &#39;code&#39; => 10001,
        &#39;msg&#39; => &#39;正在处理...&#39;
    ));exit;
}else{
    echo json_encode(array(
        &#39;code&#39; => 10000,
        &#39;data&#39; => $now_percent
    ));exit;
}

Supplement:

1. The reason why setTimeout is used instead of setinterval to check regularly is because if the set time is too short and the request response time is too long, the display will be chaotic.

2. After using the session, be careful to release it in time, otherwise the query will be waiting because the session is locked. It is best to release it after use.

Related recommendations: php training

The above is the detailed content of What is the method to implement progress bar in php. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn