2009-11-23 47 views
2

我有一個PHP腳本文件的多部分問題。我正在創建這個每秒更新數據庫的文件。沒有其他建模方法,它必須每秒完成。PHP循環充當cronjob [確保只有一個實例正在運行]

現在我正在運行CentOS,我對它很陌生。第一個noob問題是:

如何通過SSH運行一個PHP文件。我讀它只是#php path-to/myfile.php。但我試圖迴應一些東西,而我沒有在文中看到它。

現在我不認爲啓動文件會是一個問題。我猜想會有一個問題,我不知道它是否有可能,但是這裏有。

是否有可能百分百確定該文件只運行一次。如果我偶然再次運行該文件,會發生什麼情況。

我想知道更進一步,如果我實現了寫入日誌每秒,我可以知道,如果一切運行正常。如果出現錯誤或錯誤,日誌文件將停止。

是用fopen寫入日誌文件,寫入和關閉。這不會花費很多時間,在CentOS中沒有更簡單的方法。

好的另一個重點是當我運行該文件時會發生什麼。文件是在內存中運行還是在系統中使用該文件?它是否響應文件中所做的更改,例如停止執行腳本。

我可以在文件本身實現某種停止機制。或者是否有我可以用來停止文件的命令。

我知道的另一個選擇是實現每分鐘運行的cronjob。這個cronjob執行php文件。該php文件將循環一分鐘,更新所需的一切,並終止。我實現了這種方法,但只是使用瀏覽器。我只是瀏覽mu文件,然後打開它。我看到瀏覽器很忙,但沒有更新數據庫中的任何內容。有沒有人有一個想法是什麼原因可以。

我的另一個問題是通過實施cronjob方法,我填寫PLESK面板的命令是什麼。是否與上述命令相同?只是PHP和文件名。或者有像-f -q -something這樣的特殊命令。

對不起所有noob問題。

如果有人能幫助我,我真的很感激它。

Ciao!

+2

您可能想將問題分解爲單獨的條目。 – 2009-11-23 02:31:32

+0

同意Darrell。針對每個問題的單個問題或問題,更可能得到有用的答案。 – cletus 2009-11-23 02:47:27

回答

8

,以確保只有一個腳本的副本正在運行的最簡單的方法是使用flock()獲取文件鎖。例如:

<?php 

$fp = fopen("/tmp/lock.txt", "r+"); 

if (flock($fp, LOCK_EX)) { // do an exclusive lock 
    ftruncate($fp, 0); // truncate file 
    fwrite($fp, "Write something here\n"); 
    flock($fp, LOCK_UN); // release the lock 
} else { 
    echo "Couldn't get the lock!"; 
} 

fclose($fp); 

?> 

所以基本上你有一個虛擬文件設置您的腳本,在啓動時,試圖獲取一個鎖。如果成功,它就會運行。如果沒有,則退出。這樣,一次只能運行腳本的一個副本。

注:flock()是所謂的諮詢鎖定方法,這意味着,如果你使用它,它纔會起作用。所以這會阻止你自己的腳本被多次運行,但不會對任何其他腳本執行任何操作,這在你的情況下聽起來很好。

+1

我嘗試使用這個實際上,但一個實例讓我。它是這樣的:在執行腳本時,文件被鎖定,現在將繼續執行其操作,只需要用數據加載查詢數據庫,突然間cronjob停止並失敗。現在鎖定文件仍然被鎖定並且沒有被釋放。這將導致腳本永遠不會被執行。你如何處理這種情況? – oneofakind 2014-04-15 17:11:32

2

您不能總是依靠腳本本身的鎖定,正如前面的回答的評論中所述。這可能是一個解決方案。

#Mins Hours Days Months Day of week 
    *  *  *  *  * lockfile -r 0 /tmp/the.lock; php parse_tweets.php; rm -f /tmp/the.lock 
    *  *  *  *  * lockfile -r 0 /tmp/the.lock; php php get_tweets.php; rm -f /tmp/the.lock 

這樣,即使腳本崩潰,lockfile也會被釋放。從這裏取:https://unix.stackexchange.com/a/158459

+1

'lockfile'不一定會出現在給定的系統上。如果不是,你需要安裝'procmail'包。 – 2015-10-27 21:50:29

相關問題