我有一個循環。它有相當長的時間,我需要可視化過程工作。這個怎麼做?如何顯示進度?
while ($csvIterator->next()) {
//a lot of code...
visualizeProcess();
}
我有一個循環。它有相當長的時間,我需要可視化過程工作。這個怎麼做?如何顯示進度?
while ($csvIterator->next()) {
//a lot of code...
visualizeProcess();
}
編輯
- 這個假設您使用PHP的基於Web的應用程序。
總之,沒有簡單的方法來做到這一點。有很多領域需要巧妙地設計你的應用程序來處理它(例如:如果你一頁一頁地構建頁面,那麼如果它應該被保護,會發生什麼?你需要實現SSL和確保所有AJAX調用都已加密)。基本上你需要做的是讓腳本可以在塊中執行,而不是有一個循環完成整個操作。例如,有一個PHP文件,它將一個整數作爲查詢字符串,然後使用該整數來執行不同的操作。一旦整數等於一定的數字,你就可以確定你需要做的所有事情都已完成,因此進度達到了100%。你不能讓PHP一頁一頁地發回頁面到瀏覽器,這是你似乎打算做的。您需要使用AJAX調用(假設這是一個Web應用程序而不是命令行應用程序)。做類似下面的事情:
創建一個PHP文件,該文件通過查詢字符串接受一個int。讓傳遞的整數指示PHP腳本進行的操作(即:0 =獲取所有分配的會話變量,1 =連接到數據庫並獲取需要解析並推送到會話中的數據,2 =解析來自會話的數據並做一些事情)。
創建一個PHP文件,作爲顯示進度的基本頁面提供給客戶端。在這個頁面中,您將需要使用Javascript來請求1中提到的頁面以及各種查詢字符串。您發出的AJAX調用包含成功和失敗處理程序,並且可以在這些處理程序中更改頁面上顯示的內容以反映進程的進展情況。
簡而言之,由於Web應用程序的分佈性質,沒有簡單的方法可以對Web應用程序執行進度條。我建議你看一下GET和POST請求的工作方式,Web服務器的功能以及PHP處理程序工作的方式,以便更好地瞭解爲什麼你的初始方法不可行。
使用echo
或在循環的中間var_dump
。 implicit_flush也可能影響詳細程度。
一旦腳本完全運行,echo和var_dump都將只返回客戶機。這將不會顯示任何進展。 – MoarCodePlz
請參閱我對問題本身的評論。 – J0HN
如果用戶試圖「可視化」一個進程而不是僅僅通知用戶進度,我懷疑他們是通過命令行運行PHP的。當然,如果你通過命令行運行PHP,你可以echo和var_dump所有你想要的,但看到這是PHP的主要功能/預期功能的一小部分我會覺得奇怪的是,用戶沒有明確狀態這是從CMD運行,如果是的話。 – MoarCodePlz
使用最好的辦法是JavaScript的,但你可以使用
flush()
功能,也
你真的需要在你的問題更多的細節。如果你需要一個詳細的百分比指標,如
那麼你需要將你的循環數據分成塊(使用迭代次數/總迭代次數或字節讀取等)。
THIS GUIDE將爲您提供必要的知識來做到這一點。
如果,另一方面,你只需要像著名加載指示燈將所有你GATTA做(讓我們假設你擁有jQuery和你的腳本只流程)是
$("#myButton").click(function(){
$("#myLoaderGif").show();
$.get("myPHPScript.php", function(data){
alert("Data Loaded: " + data);
$("#myLoaderGif").hide();
})});
這個例子假設你有一個<img id="myLoaderGif">
標記與您的加載圖像和一些元素id = myButton
,啓動腳本,您正在使用獲取檢索數據
嘗試使用Javascript。 – thedaian
是否要在執行完整腳本之前發送頁面的一部分,或顯示某種進度條? – TJHeuvel
取決於一切,但我相信你會需要'echo'函數。 – Kokos