2012-02-27 74 views
2

我們需要在我們沒有SSH訪問權限的服務器上解壓/解壓縮非常大的存檔文件。我們的另一種選擇是通過PHP執行系統命令來解壓文件。使用PHP以很長的超時時間執行系統命令?

問題是,它需要相當長的時間來解壓縮/解壓文件。 PHP在完成前結束超時。

有沒有辦法讓untar命令完全執行,不管PHP腳本是否超時?像異步執行一樣?

或者,您如何暫時將PHP超時時間設置得非常高,以便它有足夠的時間完成文件的解壓縮?

+0

它是一個linux系統嗎?因爲在Linux上afaik花費在系統命令上的時間不計入max_execution_time限制。也許它是httpd有一些超時設置。 – 2012-02-27 23:59:33

+0

同上,它是一個Linux系統嗎?它在共享的網絡託管平臺上嗎?也許你可以定義和運行cronjobs(在共享主機中不常見),這將允許你異步解壓文件。你需要一次或每當用戶上傳壓縮文件時解壓文件?如果只有一次,也許你可以訪問帶有copmress/uncompress函數的文件管理器的Web控制面板,或者讓服務器管理員爲你解壓文件可能會更容易。 – juanrpozo 2012-02-28 21:00:01

+0

是的,它是Linux。 Rackspace雲網站。 – 2012-02-28 23:18:08

回答

1

manual

的set_time_limit()函數的功能和配置指令 的max_execution_time隻影響腳本 本身的執行時間。在確定腳本運行的最長時間 時,不包括腳本執行 以外的任何活動時間,例如使用system()系統調用,流操作, 數據庫查詢等。在測量時間是真實的Windows 上,這不是真的。

可能發生的事情是您的客戶端(瀏覽器)超時。這種斷開可能會導致腳本中止。爲了防止這種情況發生,你可以這樣做:

ignore_user_abort(true); 

然後你會想要第二個腳本來讓你檢查進度。其中一個想法是將tar的輸出寫入文件中,以便第二個腳本可以檢查結束以查看是否完成。另一個是調用一個shell腳本,該腳本依次運行tar。該shell腳本可以檢查返回代碼並用結果觸摸文件,也可以在其工作時創建基本的鎖定文件。

+0

感謝您的回答。是否可以輸出一個linux命令到一個文件,以便它不斷更新,以便另一個腳本可以檢查命令的狀態?因爲據我所知,當你使用'#command> output.txt'時,它不會寫入文件,直到命令完成。 – 2012-02-28 23:45:31

+0

從我的經驗來看,這個文件是全文寫入的,可以隨時查看。 – webbiedave 2012-02-29 00:04:17

+0

你的答案非常歡迎。但upvote會說它更好;) – webbiedave 2012-02-29 00:29:58

0

如果服務器在* nix系統上運行,則nohup命令可能可用。即

nohup tar ... >outfile.txt 

然後,您可以有PHP腳本掃描outfile.txt直到操作結束