2011-05-10 133 views
14

我有一個備份腳本,它將網站的所有文件備份到zip文件(使用與this question類似的腳本)。但是,對於大型網站,腳本會在完成之前超時。PHP備份腳本超時

有沒有什麼辦法可以延長腳本運行的時間長度?這些網站運行在共享的Windows服務器上,所以我無法訪問php.ini文件。

+0

這裏可能最好的選擇是使用[shell_exec()](http://lv.php.net/manual/en/function.shell-exec.php)在後臺運行它,同時也忽略超時設置。 – arma 2011-05-10 08:35:18

+0

Plz不要忘記接受一個答案,如果它解決了你的問題。 – 2011-05-19 12:09:25

+1

在Windows上運行PHP?這聽起來像個壞主意。然後再一次,在Mac上運行IE也是如此。 – Xeoncross 2011-05-20 16:03:14

回答

11

簡單地說,不要發起HTTP請求來啓動PHP腳本。您所遇到的邊界是因爲您使用HTTP請求而設置的,這意味着您可以暫停。更好的解決方案是使用「cronjob」或Microsoft稱之爲「計劃任務」來實現此目的。大多數託管服務提供商將允許您在特定時間執行此類任務。通過從命令行調用腳本,您不必再擔心超時問題,但您仍然有可能遇到內存問題。

如果你有一個體面的託管服務提供商,但它爲什麼不提供每日備份開始? :)

+0

託管服務提供商都需要進行每日備份;此腳本適用於客戶端自己的備份副本,而無需撥動FTP – whostolemyhat 2011-05-23 15:14:22

+1

+1這裏最好的答案是,不要創建網頁來進行備份。 cron或計劃任務 – 2011-05-23 19:30:55

+0

@什麼;仍然,使用瀏覽器來請求備份腳本通常是非常糟糕的想法,這太容易出錯了。致電託管服務提供商,並要求他們提供cronjobs或計劃任務的可能性。 – 2011-05-24 07:18:17

14

如果你是在一個共享的服務器環境,你沒有訪問php.ini文件,或者你要設置在每個站點爲基礎的PHP參數,你可以使用.htaccess文件(在Apache網絡服務器上運行時)。

例如,爲了改變max_execution_time值,所有你需要做的就是編輯.htaccess(位於網站的根目錄,通常是通過FTP入店),並添加此行:

php_value max_execution_time 300 

其中300是您希望爲php腳本設置最大執行時間的秒數。

也有通過在PHP文件

例如使用的ini_set功能的另一種方式。要設置執行時間爲5秒,您可以使用

ini_set('max_execution_time', 300); //300 seconds = 5 minutes 

如果您需要更多說明,請讓我知道。

+0

不幸的是,這些是IIS服務器,所以htaccess文件將無法工作:( – whostolemyhat 2011-05-10 09:01:17

+7

好吧沒有probs ..謝謝你的迴應。希望你已經解決了set_time_limit(0)方法建議的問題..如果不是你仍然可以嘗試ini_set()方法 – 2011-05-10 09:08:45

+1

即使有可能使用.htaccess,我也不建議使用它來爲單個腳本設置配置。僅限於備份腳本而不是整個頁面更改限制 – binaryLV 2011-05-11 07:10:32

6

您可以使用下面的腳本開始:

<?php 
if(!ini_get('safe_mode')){ 
     set_time_limit(0); //0 in seconds. So you set unlimited time 
} 
?> 

,並在腳本的末尾使用flush()函數告訴PHP來發送它已經產生了什麼。

希望這可以解決您的問題。

2

嘗試的功能:

set_time_limit(300); 

在Windows上,有輕微的可能性,你的虛擬主機提供商允許您通過設置搭在你的web服務器的根目錄上傳php.ini文件。如果是的話,上傳包含一個php.ini文件:

max_execution_time = 300 

要檢查是否設置的工作,做一個phpinfo()並檢查本地價值爲的max_execution_time。

3

是腳本給出「超出最大執行時間xx秒」的錯誤消息,還是顯示空白頁?如果是這樣,ignore_user_abort可能是你要找的。它告訴php如果與瀏覽器的通信丟失,不會停止腳本執行,這可以保護您免受通信中涉及的其他超時機制的影響。

基本上,我會在你的腳本開始這樣做:

set_time_limit(0); 
ignore_user_abort(true); 

此說,你不應該使用一個HTTP調用運行備份來作爲建議由貝瑞Langerak。 cronjob是你應該使用的。隨着set_time_limit(0),它可以永遠運行。

在共享主機環境中,可能會禁止更改max_execution_time指令,並且您可能無法訪問任何類型的命令行,但恐怕沒有簡單(並且乾淨)的解決方案問題,最簡單的解決方案通常是使用主機提供的備份解決方案(如果有的話)。

1

選項1:要求託管公司將備份置於某處可以通過php訪問,因此php文件可以重定向備份。

選項2:將備份腳本分成多個部分,也許使用一些ajax連續調用腳本幾次,給用戶一個很好的進度條,並將腳本調用的結果與php中的zip結合起來並提供下載。