2013-08-16 82 views
2

我有一個通用PHP維護腳本,它設置數據庫值以防止與另一個實例同時運行。通常通過cronjob運行。PHP腳本似乎正在執行兩次

我清除了數據庫值,並嘗試在cronjob關閉的情況下手動運行此腳本。每次我從瀏覽器運行它時,都會立即終止,說明它已經在運行。

腳本將作爲後臺進程運行約30秒,然後自動終止,就像PHP檢測到瀏覽器已關閉(應花大約15分鐘時間完成)一樣。

因此,我添加了代碼以在數據庫值設置或讀取時進行回顯。它在設置時不會迴應,只有在讀取時纔會回顯,但我可以看到每次都存儲數據庫值。

如果從cron運行,腳本總是按預期完成。

可能會發生什麼?服務器可以在每個基於瀏覽器的請求上執行兩次腳本嗎?

服務器運行Hive,因此不同的dirs可以有不同的PHP版本。不知道這可能與它有什麼關係。如果它運行決定

PHP 5.2.17 (default) 
PHP 5.3.27 (dir this script is in) 
Apache 2.2.25 

代碼很簡單:

$DB = new DbConnector($db_name, $db_user, $db_pass); 

if ($DB->queryOne("SELECT COUNT(*) FROM data_vars WHERE name = 'maintenance_running'")) { 
    exit('Already running!'); 
} else { 
    $DB->query("INSERT INTO data_vars (name, value) VALUES ('maintenance_running', 1)"); 
} 

在腳本結束,值被清零。再次,這個問題只發生在從瀏覽器運行時。

+0

是否有可能您的瀏覽器預取頁?一般來說,GET請求有副作用是一個壞主意。 – geoffspear

+0

不知道如何預取可能發生,因爲另一個頁面上的表單必須提交以從瀏覽器運行時執行此腳本。 – eComEvo

+0

檢查您的服務器的訪問日誌,並查看該腳本中有哪些匹配。如果你得到兩個命中,那麼腳本正在運行兩次... –

回答

0

你應該與執行限制設置較長的值:

set_time_limit(30*60) // 30 minutes 

而且回聲功能可能是工作,但是作爲響應發送到瀏覽器,直到整個腳本執行完畢後那是因爲,那您看不到打印,因爲它在執行限制結束並打印響應之前被殺死。

你可以嘗試呼應部分用的

ob_start 

ob_flush 

的幫助下,響應您可以瞭解更多關於ob_functions here