2017-08-12 70 views
1

我在Ajax中製作了一個進度條時遇到了很大的問題。整個頁面在ajax中,其中一個網頁是ajax,加載一個從數據庫中獲取一些大行的函數。我嘗試在foreach循環中使用flush()方法並通過寫入/讀取到$ _SESSION來完成此腳本中的進度條,但仍然沒有任何結果,我試着嘗試所有我不知道如何執行此操作的內容。只需要這個來完成我的項目。有人可以幫助我嗎?無論如何,這是我想加載的腳本,這個進度條的模板如何在GET或POST ajax中用於任何AJAX。加載腳本的AJAX進度條

<script> 
    jQuery(document).ready(function($) { 

      $(document).on('click','#save',function() { 
       setTimeout(getProgress,1000); 
       $(this).text('Pobieram analizę...'); 
       $.urlParam = function(name){ 
      var results = new RegExp('[\?&]' + name + '=([^&#]*)').exec(window.location.href); 
    if (results==null){ 
     return null; 
    } 
    else{ 
     return decodeURI(results[1]) || 0; 
    } 
      } 
     var id = $.urlParam('id'); 
     var idt = $.urlParam('idt'); 
        $.ajax({ 
           url: "views/getresults.php?id="+id+"&idt="+idt, 
        success: function(data) { 
         $("#loadresults").append(data); 
        } 
       }); 
       setTimeout(getProgress,3000); 
      return false; 
      }); 
      function getProgress(){ 

       $.ajax({ 
        url: 'views/listen.php', 
        success: function(data) { 
         if(data<=100 && data>=0){ 
          console.log(data); 
          $('#loadresults').html('<div id="progress"><div class="progress-bar" role="progressbar" style="width:'+ (data/100)*100 +'%">'+ data + '/' +100+'</div></div>'); 
          setTimeout(getProgress,1000); 
          console.log('Repeat'); 
         } else { 
          $('#loadresults').text('Pobieram dane'); 
          console.log('End'); 
         } 
        } 
       }); 
      } 
     }); 
     </script> 

這裏一個GETRESULTS.PHP

foreach($result as $resul) { 
    $count++; 
    session_start(); 
    $_SESSION['progress'] = $count; 
    $_SESSION['total'] = 100; 
    session_write_close(); 
    sleep(1); 
} 
unset($_SESSION['progress']); 

AND A GET進展功能LISTEN.PHP

<?php 
session_start(); 
echo (!empty($_SESSION['progress']) ? $_SESSION['progress'] : ''); 

if (!empty($_SESSION['progress']) && $_SESSION['progress'] >= $_SESSION['total']) { 
    unset($_SESSION['progress']); 
} 

?> 
+0

您曾經嘗試過什麼? –

+0

主要是這個會話的方法,任何刷新和與微調在html5的東西 – CommanderSpock

+0

我是新的阿賈克斯,我做了很多工作,但這個進度條是... – CommanderSpock

回答

1

寫入和讀取會話不起作用,因爲PHP的標準行爲是在執行主代碼鎖定會話文件。

嘗試創建一個文件並使用執行功能期間完成的百分比更新其內容。喜歡的東西:

<?php 
function slowFunction() { 
    $file = uniqid(); 
    file_put_contents($file, 0); 
    // Long while that makes your stuff 
    // you have to know how many loops you will make to calculate the progress 
    $total = 100; 
    $done = 0; 
    while($done < $total) { 
     $done++; 
     // You may want not to write to the file every time to minimize changes of being writing the file 
     // at the same time your ajax page is fetching it, i'll let it to you... 
     $progress = $done/$total; 
     file_put_contents($file, $progress); 
    } 
    unlink($file); // Remove your progress file 
} 

>

+0

所以它與會話相同的東西,但使用文件是? – CommanderSpock

+0

您能否將此代碼實現到我的代碼中以更好地理解? – CommanderSpock

+0

對不起,當我看到你的問題時,沒有代碼。是的,和會話一樣,但使用文件。你的函數「getProgress」必須監聽那個文件,所以你必須傳遞它的名字而不是「listen.php」。 –

0

你不能從阿賈克斯數據下載的進度。一旦您向服務器請求您的請求,下一個響應將僅在獲取數據或出現錯誤之後。

解決方案是,將數據作爲分數獲得。如先下載數據的1/10,並在成功回調中,再次遞歸調用ajax請求2/10的數據。在每次成功回調中,您都可以更改進度欄。

+0

我粘貼我的代碼 – CommanderSpock

0

看看服務器端的事件或長輪詢作爲選項