我們需要在我們沒有SSH訪問權限的服務器上解壓/解壓縮非常大的存檔文件。我們的另一種選擇是通過PHP執行系統命令來解壓文件。使用PHP以很長的超時時間執行系統命令?
問題是,它需要相當長的時間來解壓縮/解壓文件。 PHP在完成前結束超時。
有沒有辦法讓untar命令完全執行,不管PHP腳本是否超時?像異步執行一樣?
或者,您如何暫時將PHP超時時間設置得非常高,以便它有足夠的時間完成文件的解壓縮?
我們需要在我們沒有SSH訪問權限的服務器上解壓/解壓縮非常大的存檔文件。我們的另一種選擇是通過PHP執行系統命令來解壓文件。使用PHP以很長的超時時間執行系統命令?
問題是,它需要相當長的時間來解壓縮/解壓文件。 PHP在完成前結束超時。
有沒有辦法讓untar命令完全執行,不管PHP腳本是否超時?像異步執行一樣?
或者,您如何暫時將PHP超時時間設置得非常高,以便它有足夠的時間完成文件的解壓縮?
從manual:
的set_time_limit()函數的功能和配置指令 的max_execution_time隻影響腳本 本身的執行時間。在確定腳本運行的最長時間 時,不包括腳本執行 以外的任何活動時間,例如使用system()系統調用,流操作, 數據庫查詢等。在測量時間是真實的Windows 上,這不是真的。
可能發生的事情是您的客戶端(瀏覽器)超時。這種斷開可能會導致腳本中止。爲了防止這種情況發生,你可以這樣做:
ignore_user_abort(true);
然後你會想要第二個腳本來讓你檢查進度。其中一個想法是將tar的輸出寫入文件中,以便第二個腳本可以檢查結束以查看是否完成。另一個是調用一個shell腳本,該腳本依次運行tar。該shell腳本可以檢查返回代碼並用結果觸摸文件,也可以在其工作時創建基本的鎖定文件。
感謝您的回答。是否可以輸出一個linux命令到一個文件,以便它不斷更新,以便另一個腳本可以檢查命令的狀態?因爲據我所知,當你使用'#command> output.txt'時,它不會寫入文件,直到命令完成。 – 2012-02-28 23:45:31
從我的經驗來看,這個文件是全文寫入的,可以隨時查看。 – webbiedave 2012-02-29 00:04:17
你的答案非常歡迎。但upvote會說它更好;) – webbiedave 2012-02-29 00:29:58
這應該這樣做,如果你的服務器配置不阻止您修改這些值:
set_time_limit(0);
ini_set('max_execution_time', 0);
如果服務器在* nix系統上運行,則nohup命令可能可用。即
nohup tar ... >outfile.txt
然後,您可以有PHP腳本掃描outfile.txt直到操作結束
它是一個linux系統嗎?因爲在Linux上afaik花費在系統命令上的時間不計入max_execution_time限制。也許它是httpd有一些超時設置。 – 2012-02-27 23:59:33
同上,它是一個Linux系統嗎?它在共享的網絡託管平臺上嗎?也許你可以定義和運行cronjobs(在共享主機中不常見),這將允許你異步解壓文件。你需要一次或每當用戶上傳壓縮文件時解壓文件?如果只有一次,也許你可以訪問帶有copmress/uncompress函數的文件管理器的Web控制面板,或者讓服務器管理員爲你解壓文件可能會更容易。 – juanrpozo 2012-02-28 21:00:01
是的,它是Linux。 Rackspace雲網站。 – 2012-02-28 23:18:08