我有我的Linux腳本以及Windows服務器上運行的PHP腳本。 我想使用相同的腳本,而不對這兩種環境進行任何修改。如何防止腳本的多個實例?
這些腳本將與我的Windows環境計劃與cron(在Linux上)和Windows調度程序(或其他,我不在乎)。
但是,其中一些腳本可能需要幾分鐘才能完成。我只是想阻止調度程序(cron或windows的)啓動相同的腳本,然後才能啓動它。
我不知道該怎麼做.. 我想確保在執行過程中出現問題時釋放「鎖定」,所以下次不需要人工干預就可以重新啓動。
也許與一個虛擬文件的羊羣會做的伎倆,但我不知道該怎麼做。
我在這些服務器上也有一個MySQL數據庫。我想也許使用數據庫端的鎖。
1- Start a transaction
2- Insert script name in a table.
3- execution of the script.
4- If successful then delete the row and commit the transaction or simply rollback;
如果腳本名稱在表中,我可以阻止它運行。 如果腳本執行失敗,則Mysql將自動回滾該事務,以便在下次調用該腳本時不會出現該行。
但是,在一個事務中,有沒有辦法讓其他連接看到未公開的數據?如果是的話,怎麼樣?
我也使用該行的鎖,如果它是不可能使用回滾事以爲,
1- Insert script name in a table if it doesn't already exists.
2- Start a transaction.
2- Select * from Table where script_name FOR UPDATE.
3- execution of the script.
4- If successful then release the lock (rollback or commit).
但是我在這裏主要的問題是與MySQL。選擇FOR UPDATE掛起直到上一個鎖被釋放,或者如果經過了50秒超時(innodb_lock_wait_timeout變量)。我希望Mysql在現場告訴我,我的行在不影響整個數據庫的情況下被鎖定。這是因爲innodb_lock_wait_timeout變量是全局變量(不是會話之一)。 是否有另一個模仿Oracle中可用的NO_WAIT子句的變量?
或者我應該讓劇本掛50秒沒有任何問題?
什麼是最好的辦法,因爲我是一個PHP新手,我不想在服務器上造成任何問題。
也許我還有另外一個選擇,我沒有看到..
您的腳本在任何情況下都使用MySQL數據庫嗎?或者其他一些資源? – VolkerK
其中有些是有的,有些則不是......這些腳本是可配置的,我希望在所有這些腳本都會繼承的基類上實現鎖定。所以可以使用數據庫。 – Pmax