Maison  >  Article  >  développement back-end  >  Comment implémenter la barre de progression en php

Comment implémenter la barre de progression en php

藏色散人
藏色散人original
2020-09-01 10:19:383088parcourir

Comment implémenter la barre de progression en PHP : 1. Utilisez "output buffer control" pour afficher directement la barre de progression ; 2. Utilisez ajax pour demander d'abord l'adresse du traitement logique, puis utilisez session ou autre ; support de stockage pour enregistrer la progression du traitement.

Comment implémenter la barre de progression en php

Recommandé : "Vidéo PHP Tutoriel

Il existe deux manières principales d'implémenter la barre de progression en PHP L'une consiste à utiliser le "contrôle du tampon de sortie" pour afficher directement la barre de progression, et l'autre est la méthode ajax

.

Parlons-en d'abord. Méthode "Contrôle du tampon de sortie" :

Cette méthode utilise principalement plusieurs fonctions tampon de PHP. Cette méthode peut être exécutée directement sans changer le fichier de configuration. :

<?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();   //刷新缓冲区的内容,输出
}

Remarque : Ce style de barre de progression a été trouvé en ligne Après une légère modification, vous pouvez le remplacer par le style que vous souhaitez

La "méthode ajax" est un peu plus gênante. La logique de cette méthode est d'utiliser ajax pour demander en premier. (De préférence une requête asynchrone) L'adresse du "traitement logique", utilisez une session ou un autre support de stockage (tel que memcache, redis, etc.) pour sauvegarder. la progression du traitement, et utiliser ajax pour demander (de préférence une requête synchrone) une autre requête. L'adresse de la progression pour obtenir un retour en temps réel

Le code est posté ci-dessous :
Le premier est le 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
<?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;
}

Remarque : 1. La raison pour laquelle setinterval n'est pas utilisé pour vérifier régulièrement et setTimeout est utilisé parce que si le temps défini est trop court et le temps de réponse à la demande est trop long, l'affichage sera chaotique
2. Attention à libérer la session à temps après l'avoir utilisée, sinon la requête continuera d'attendre car la session est verrouillée. Il est préférable de la libérer après utilisation

<.>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn