2011-12-12 25 views
4

我見過很多實現進度條的web應用,但是,我的問題與非上傳類有關。如何實現現代PHP Web應用程序的AJAX進度指示器?

許多PHP web應用程序(phpBB,Joomla等)都實現了一個「智能」安裝程序,它不僅指導您完成軟件的安裝,還能讓您瞭解當前正在執行的操作。例如,如果安裝程序正在創建SQL表或編寫配置文件,它會報告這一點而不要求您點擊。 (基本上,坐下來放鬆安裝。)

另一個很好的例子是與Joomla的Akeeba備份(以前的Joomla包)。當您執行Joomla安裝的備份時,它會對安裝目錄進行完整歸檔。但是,這需要很長時間,因此需要更新進度。但是,服務器本身對PHP腳本執行時間有限制,所以似乎要麼

  1. 備份腳本能夠繞過它。
  2. 存儲了一些臨時數據,以便將檔案追加到(如果可以添加檔案)。
  3. 客戶端腳本經常調用服務器的PHP來執行操作。

我一般猜測(不特定於Akeeba)是#3,即:

 
Web page JS -> POST foo/installer.php?doaction=1 SESSID=foo2 
Server -> ERRCODE SUCCESS 
Web page JS -> POST foo/installer.php?doaction=2 SESSID=foo2 
Server -> ERRCODE SUCCESS 
Web page JS -> POST foo/installer.php?doaction=3 SESSID=foo2 
Server -> ERRCODE SUCCESS 
Web page JS -> POST foo/installer.php?doaction=4 SESSID=foo2 
Server -> ERRCODE FAIL Reason: Configuration.php not writable! 
Web page JS -> Show error to user 

我99%肯定這是不是這樣的,因爲這將創建一個非常討厭的依賴用戶啓用Javascript。

我想我的問題可以歸結爲以下幾點:

  • 是如何長時間運行的PHP腳本(Web服務器上,當然)處理,並能夠「活下去」過去的PHP最大的執行時間?如果他們不「作弊」,他們如何能夠將任務分散到手邊? (我注意到Akeeba Backup確實承認了PHP的最大執行時間限制,但我不想深深地發現這樣的代碼。)
  • 通過AJAX + PHP顯示進度如何?我讀過人們使用文件來指示進度,但對我來說,這似乎是「骯髒」,並對I/O造成一些壓力,特別是對於運行上述腳本的擁有10,000多個訪問者的活動服務器。

此腳本的環境是啓用safe_mode的地方,限制一般爲30秒。 (基本上是一個限制性的,免費的0美元的主機)。這個腳本針對所有觀衆(將會公開),所以我無法控制它的主機。 (並且這假設我不會責怪最終用戶有一個不好的主機。)

我不一定需要代碼示例(雖然他們非常感謝!),我只需要知道實現這一點的邏輯流程。

+0

注意:這些安裝程序將要求您啓用JavaScript以執行您所描述的任何幻想效果 - 如果您的應用正在執行的任務取決於JavaScript *,則取決於JavaScript *沒有任何「討厭」。人們會使用漸進式增強功能(只有在javascript可用時才添加功能)才能添加絕對可選的功能。在你給的例子中,AJAX調用輪詢,更新頁面,顯示和隱藏進度條......所有這些都需要JavaScript,這很好。 –

+0

@Chris是的,當且僅當它依賴於Javascript。顯然,漂亮的進度條(以及一般的任何進度顯示)都需要AJAX。但是,如果用戶根本沒有Javascript呢?我的應用程序沒有依賴於Javascript - 只是簡單的HTML和CSS3。因此,我詢問了長時間運行PHP腳本的另一個問題。 :)(我認爲這是可能的更新sans Javascript與<元刷新,但不是非常確定。) –

回答

1

通常,這種事情存儲在$ _SESSION變量中。就執行超時而言,我通常所做的就是有一個JavaScript超時,它將每個x秒的更新狀態div的innerHTML設置爲一個PHP腳本。當這個腳本執行時,它不會「等待」或類似的東西。它僅從會話中獲取當前狀態(通過實際執行安裝的腳本更新),然後以我認爲合適的任何特殊方法(狀態欄等)輸出該狀態。

我不會推薦任何狀態更新的直接I/O。你是正確的,它是混亂和效率低下。我會說$ _SESSION絕對是這裏走的路。

+0

得到愛它時,有人標記了唯一的答案,沒有提供一個替代的答案,甚至留下評論大聲笑.... –

+0

(抓住他的斧頭,聽着巨魔的呼叫) –

+0

我不知道爲什麼它被拒絕了,但是...... $ _SESSION變量聽起來不是一個壞主意!我認爲這可能會起作用,但只涉及Javascript。我仍然堅持PHP執行的長度,以及它如何繞過它。儘管如此,+1對於這個問題的一些見解。 :) –

相關問題