我有一個通用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)");
}
在腳本結束,值被清零。再次,這個問題只發生在從瀏覽器運行時。
是否有可能您的瀏覽器預取頁?一般來說,GET請求有副作用是一個壞主意。 – geoffspear
不知道如何預取可能發生,因爲另一個頁面上的表單必須提交以從瀏覽器運行時執行此腳本。 – eComEvo
檢查您的服務器的訪問日誌,並查看該腳本中有哪些匹配。如果你得到兩個命中,那麼腳本正在運行兩次... –