2010-03-11 151 views
2

我有一個數據庫在MySQL中有時間條目。有超過1000個時間條目。我想提取時間並準確運行一個PHP腳本,當時..連續運行PHP腳本

我試圖運行一個PHP腳本不斷檢查時間,但我的服務器不允許運行腳本超過60秒。

編輯。我必須每秒檢查一次數據庫。有其他選擇嗎?

+0

如何通過cron作業運行腳本? – jamieb

+0

Cron作業是個好主意,但我也必須運行查詢來檢查數據庫和當前時間,這將花費太多時間。有沒有其他方法可以這樣做。 – nicky

+0

您可以使用set_time_limit(0);讓你的php腳本永遠運行,但是大約1天后你的腳本將會使用超過1GB的內存。 PHP的內存管理器是非常原始的,如果你想長時間運行1個進程,你將不得不使用java或編寫一些非常肛門的C++。 – rook

回答

3

試試Unix的cron

3

您需要一些外部服務來執行腳本。在Unix上,這將是cron。在Windows中,使用Task Scheduler

1

你有沒有想過把你的進程寫成服務器守護進程。它會啓動並永久運行在一個while循環中。每隔幾分鐘或無論如何,您都希望能夠檢查下一個x分鐘的運行時間。您排隊您的請求,並且每當您發現需要運行的腳本時,您就會啓動它。我不認爲cron是你想要的,因爲你正試圖在任意時間安排未來的事件......而且我確定這正是你現在用來每秒鐘檢查db的情況。

+0

是的。我必須每秒檢查一次數據庫。 有沒有其他解決方案。因爲一次又一次的查詢會變得非常麻煩。 – nicky

+0

那麼你只需每檢查一次X分鐘,就可以在下一個X分鐘內運行它。例如: 從時間

0

您必須使用sleep(arg)函數來暫停PHP腳本一段時間,然後繼續。

sleep(50); //Pauses 

myFunction(); //Runs after the pause 

例如,這會將腳本暫停50秒。

+0

只有當max_execution_time參數設置爲一個非常高的值(我不確定絕對最大值是多少......),還有'set_time_limit()'函數和其他可能的變量時,該解決方案才能工作。例如,您希望腳本運行整整一個星期或一個月 - 例如,它不是一個有效的解決方案,但它可以在延遲很短的循環中執行,以縮短執行時間。 –

0

寫PHP腳本從數據庫中讀取和條目添加到你的crontab,使在期望的時間

0

運行保持運行的進程的腳本是不是一個很好的解決方案,這不僅是因爲你需要以確保它保持運行。想必你知道下一次事件何時會發生 - 所以使用'atd'來安排它 - 當觸發腳本時也應該工作在何時以及如何安排下一個工作。

這確實意味着作業是鏈接的 - 並且失敗會打破鏈條,atd的大多數實現的粒度也可能相當高。

您可能想要使用像Nagios這樣更復雜的調度工具或像DJB的daemontools或Oracle的OPMN這樣的過程監控類型方法。

C.

0

DJB的daemontools的是偉大的。顯然,系統和/或Upstart,雖然Remnant扮演一個真正的wanker。