2012-12-11 50 views
1

我想要有一個「加載消息」的種類,讓我知道PHP腳本在執行過程中的位置;爲了做到這一點,我試圖在整個過程中回顯HTML/JavaScript標記,但是在腳本的其餘部分運行之前,沒有任何回聲在執行。除了使用AJAX還有其他解決方法嗎,還是僅僅是獸的本質?試圖讓PHP發送HTML到服務器中間腳本

+1

[flush()](http://nz.php.net/manual/en/function.flush.php)但我覺得它不可靠,我會去'野獸的性質' – 2012-12-11 19:28:13

+0

如果你的html太大了,或者需要這麼長時間才能輸出你「需要」一個加載消息 - 你正在看錯誤的問題。你的意思是不同的?你是否在談論長時間運行的服務器進程的進度? – AD7six

+0

這是什麼日誌文件... – Izkata

回答

1

阿賈克斯聽起來像是要走的路。使用一個請求開始大操作,並使用另一個請求定期輪詢。

有一點值得注意,但如果你使用會話:PHP的默認會話處理程序塊在session_start上,所以你不能處理同一會話的兩個請求。第二個會等到第一個會話關閉。如果您的輪詢在您的大操作完成之後才返回響應,則必須解決此問題。

如果操作非常大,請考慮在後臺而不是在請求期間運行它。您可以每隔一秒左右刷新一次進度頁面。不是很優雅,但可能更容易實施。

0

您可以讓腳本從您的服務器請求另一個文件,並在GET中傳遞信息。但我不會向任何人推薦這個。對於除調試以外的任何其他任何東西都基本沒用。

這甚至不會使用ajax來完成,因爲php完全在服務器上執行。 Ajax請求從用戶的瀏覽器執行。

另一種完成此操作的方法是在進行sql插入操作時。

編輯:如果你想實時的這個信息。這並不容易完成。你需要將我上面發佈的內容與ajax混合以在另一個頁面中請求信息。

0

我建議用AJAX做這兩個請求。第一個請求將工作,直到工作完成。第二個請求會每隔幾秒鐘重複一次,從數據庫中提取數據,並在JSON中迴應進度,然後由JavaScript進行解析並更新進度。你甚至可以在上面做一些進度條!

0

您可以使用flushob_flush(第一後已經開始與ob_start) - 但是不同的瀏覽器會以不同方式處理髮送給他們的早期內容。一直以來的規則是真實的(我最近沒有檢查過),大多數瀏覽器在接收到一定數量的字節之前不會開始渲染任何東西。

現在,如你所知,有更好的方法來做到這一點。 Ajax可能是最好的。不過,我已經在許多後端管理腳本中使用了這個系統,這些腳本工作正常。基本上,首先做下面的事情:

ob_start(); 
echo strpad('', 1024, ' '); 
ob_flush(); 
echo '<script>updateProgress(0.1);</script>';ob_flush(); 
/// do something else 
echo '<script>updateProgress(0.2);</script>';ob_flush(); 
/// do something else... 
echo '<script>updateProgress(0.3);</script>';ob_flush();