2013-09-23 43 views
-1

我有一個簡單的安裝程序,分爲多個段,不是語法,而是邏輯。以下是它的工作方式:安裝進度條php

if ($_POST['install'] == "Install") 
{ 
// fetches user values 

// creates tables 

// creates some files 

// creates some emails 

// inserts relevant stuff into the database 

// finishes 
} 

該代碼太長而且對此問題沒有必要。這些步驟中的每一步都完成了20%的安裝,我將如何使進度條向用戶顯示信息?我希望這樣做的原因有兩個,一個是讓他們跟蹤,另一個是讓他們知道在完成之前不應該關閉瀏覽器選項卡。

現在我的想法是爲代碼的每個部分分配一個變量,例如第一個中的$done = 20%,第二個中的$done = 40%等等,並且簡單地顯示基於該變量的進度條。我唯一不知道的是如何顯示進度條?

感謝

+2

該過程實際需要多長時間?這一切都是在一個請求中完成還是「嚮導」式安裝? (看起來像它一次安裝) –

+0

它創建10個表,插入一些數據,掛鉤到cPanel中創建一些電子郵件,更改一些文件名並創建1個文件。根據託管機器的負載,我會說1-2分鐘左右。這一切都是一步完成的,你填寫一個表格並按下install =) –

回答

2

我推薦的解決方案:

創建你的進程,像這樣的每個步驟單獨Ajax請求......

// do first step 
$.ajax({ 
    url: myUrl + '?step=1', 
    success: function() { 
    // update progress bar 20% 
    } 
}); 

// do second step 
$.ajax({ 
    url: myUrl + '?step=2', 
    success: function() { 
    // update progress bar 40% 
    } 
}); 

// etc. 

如果你想幹燥,試試這個:

var steps = 5; 

for (var i = 1; i <= steps; i++) { 
    $.ajax({ 
     url: myUrl + '?step=' + i; 
     success: function() { 
     // update success incrementally 
     } 
    }); 
} 

用jQuery UI進度條:

$(function() { 

    $("#progressbar").progressbar({ 
     value: 0 
    }); 

    var steps = 5; 

    for (var i = 1; i <= steps; i++) { 
     $.ajax({ 
      url: myUrl + '?step=' + i; 
      success: function() { 
      // update success incrementally 
      $("#progressbar").progressbar('value', i * 20); 
      } 
     }); 
    } 

}); 

Ref。 http://jqueryui.com/progressbar/#default

+1

這種方法的另一個好處是每個部分都是獨立的。如果失敗了,你還沒有失去一切。您可以重新開始停止。 –

+0

聽起來很容易。如果我說我從字面上知道0 ajax,你會如何建議我在這裏顯示基於你的代碼的進度條?謝謝! –

+0

您擁有代碼的方式會導致所有的ajax函數立即啓動,實質上是在同一時間執行每個步驟,當它們應該在步驟中完成時,一個接一個地完成。 –

1

最佳做法是將進度值存儲在數據庫或鍵值存儲系統(如APC,Memcache或Redis)中。然後用ajax查詢檢索進度。

一個很好的jQuery插件是從jQuery的UI progressbar欄,您可以使用JSON來編碼進度值:

// GET /ajax/get-status.json 
{ 
    "progress":10, 
    "error":"", 
    "warning":"" 
} 

頁:

<div id="error" style="color: red"></div> 
<div id="warning" style="color: yellow"></div> 
<div id="message"></div> 
<div id="progressbar"></div> 
<script type="text/javascript"> 
     jQuery(document).ready(function() { 
      $("#progressbar").progressbar({ value: 0 }); 
      $.ajaxSetup({ cache: false }); 

      function updateProgress() { 
       jQuery.getJSON("/ajax/get-status.json", function(response) { 

        if (response.error) { 
         $("#error").html(response.error); 
         return; 
        } else { 
         $("#progressbar").progressbar('value', parseInt(response.progress)); // Add the new value to the progress bar 
         $("#message").html(response.message); 
         $("#warning").html(response.warning); 
         if(parseInt(response.progress) < 100){ 
          setTimeout(updateProgress, 1); 
         } 
        } 
        }); 
      } 

      updateProgress(); 
     });   
</script> 
+0

我正在研究APC,但從我的理解中,用戶將不得不手動安裝它,並且試圖儘可能地簡化它。我將研究這裏提供的所有解決方案並實施一個,謝謝=) –

+0

如果您不想使用db或任何鍵值系統,您可以在會話中始終使用它,則APC安裝在服務器端 –

+0

上。 – skler

1

您可以使用HTML5進度酒吧。

發送ajax請求並返回完成百分比。 更改進度標籤的值。

<progress id='p' max="100" value="50"></progress> 
+0

雖然這是一個答案,但它是一個非常無用的。 –

+0

如何?他不確定如何顯示進度條。 – Vlad

+0

我猜這個答案在第五次編輯後效果更好 –