2012-11-29 49 views
1

有什麼辦法讓服務器調用一些函數來檢查我的數據庫,看看有些值是否定期有效(每10秒)?定期從服務器端調用函數?

所以我不需要實際訪問我的身邊讓javascript做這項工作,服務器會每隔10秒自動調用一次函數?

+0

可能有用:http://stackoverflow.com/questions/1726116/run-a-php-script-every-second-using-cli – MrLore

+0

cron作業? JS真的只存在於客戶端,所以你必須在任何時候打開瀏覽器存到自己的網站JS有這任何部分。 –

+0

使用cron作業http://en.wikipedia.org/wiki/Cron –

回答

2

有一個非常簡單易用的windows任務調度程序。我不認爲你會得到10秒10秒的分辨率..你很可能必須每分鐘計劃一次。

你也可以安排一個任務調度程序(或cron的,Linux)的項目來運行它,說3-4倍成一排,每分鐘:

for($x = 0; $x < 4; $x++) { 
    yourFunction(); 
    sleep(10); 
} 

所以,以這種方式,你有一個腳本每分鐘執行4次,但不是精確地每10秒執行一次。記住,如果你每10秒鐘做6次,這將會超過60秒,因爲你的腳本也需要時間來執行,並且你會有重疊。

如果使用任務調度方法或上述方法,我會寫一個「鎖定」,因此,如果任務調度程序正在運行先前啓動的check腳本,二級永遠不會運行,如:

if(is_readable('is_running')) { 
    die("Already have one running"); 
} 

file_put_contents('is_running', date('r')); 

// at the end of the script, remove is_running since it won't be running anymore 
unlink('is_running'); 

date('r')所以如果有任何問題,您可以通過在文本編輯器中打開它來查看上次鎖定寫入的時間。再一次,除非你非常精確地做到這一點,否則你最終可能會得到(1)腳本運行,除非每分鐘運行一次,否則會有兩個腳本運行,可能會導致大量進程緩慢崩潰(2)if你使用鎖定,它可能每隔10秒鐘運行一次,每隔一分鐘運行一次,如果鎖定持續一眨眼的時間超過60秒...(3)誰知道還有什麼...這是爲什麼在我的例子中,如果你真的需要每分鐘運行一次以上,我建議每分鐘運行3-4次,間隔10秒。 (如果你的腳本需要相對較長的時間,這仍然會導致問題,所以再次..)

另一種可能更容易出現問題的方法是在Windows服務器上使用長時間運行的PHP腳本,確實是這樣的:

while(1) { 
    yourFunction(); 
    sleep(10); 
} 

然而,這是不可靠的進程下去(模具)偶爾,你需要確保它開始於開機,並且還應對一個黑盒子運行的命令在服務器上的所有線腳本。另外,在長時間運行的流程中,您可能還需要一個輔助腳本來檢查它是否每分鐘都運行正常。

最後,而且我用這個方法很多更上將被重倉...例如服務器,說你知道你得到超過1打每隔10秒,你可以在引入概率每 PHP腳本(比如,爲包括,使用類似):在負載很重的站點

if(mt_rand(1,100) < 10) { 
    yourFunction(); 
} 

還是我的首選方法是使用一個內存存儲像APC,Redis的,或內存緩存(這我會已經使用過,因爲它是一個負載很重的網站),並簡單地存儲「最後一次運行」的時間,如果它如超過10秒鐘之前,立即更新運行時間,然後運行僞e.x函數。:

if($yourStore->get('last_garbage_collection') < (time() - 10)) { 
    $yourStore->set('last_garbage_collection', time()); 
    yourFunction(); 
} 

最後的運行時間也可以存儲在MySQL中,會話(對於每個用戶的垃圾收集,檢查腳本,等等),或什麼的。

所以,就Windows而言,確實沒有偉大的辦法做任何事情。我的建議是毫無疑問的任務調度/ cron來只是每分鐘運行一次(你真的需要檢查每10秒?),或與垃圾收集時間的最後一個方法,如果你必須有10秒的分辨率,負載過重的網站有幾十每秒請求數,或更多的,在所有的時間,和知道,仍可能無法運行所有的時間,休息,或者更糟。

0

有第三方調度適用於Windows,會做的伎倆爲您服務。這取決於你的Windows版本。幾年前,我用Autotask 2000祝你好運。不確定它是否適用於較新版本的Windows。

相關問題