2012-08-16 94 views
1

我想讓一個php守護進程進入睡眠狀態(使用System_Daemon :: iterate()) ,因此它在一個小時內隨機傳播最多20次。也許最小距離會很聰明,所以它在前半小時不會跑20次,下半場不會跑0次。PHP中的隨機延遲計時器

我有點卡在這裏,不知道如何開始這一個,任何幫助是非常apreciated!

+0

總是讓我想知道爲什麼有人會這麼做。 – GolezTrol 2012-08-16 16:02:02

+0

當您運行大型服務器場時,您不需要同時在所有主機上執行完全相同的計劃維護,甚至不需要完全相同的頻率,就需要執行此類操作。對於那種情況下的人來說,這是一個很好的問題。 – 2014-01-11 17:55:24

回答

1

,我想出了一個可能的解決方案,我沒有嘗試它,所以它主要包含語法或邏輯錯誤。因爲它作爲一個守護進程運行,所以它周圍有一個永無止境的循環。

// 3600 seconds or one hour 
$timeframe=3600; 
// run max 20 times in $timeframe 
$runtimes=20; 
// minimum delay between two executions 
$mindelay=60; 
// maxium delay between two executions 
$maxdelay=240; 

if ($cnt % $runtimes != 0) { 
    $delay = rand($mindelay,$maxdelay);  
    System_Daemon::iterate($delay);  
    $sum += $delay; 
    $cnt++; 
} else { 
    //final delay till the $timeframe 
    if ($sum < $timeframe) { 
     System_Daemon::iterate($timeframe - $sum); 
    } 
    $sum=0; 
} 

它不完美,你浪費了一些時間,但我想它會完成這項工作。 有何評論?

2

您可以使用cron作業來將腳本設置爲經常運行。

http://net.tutsplus.com/tutorials/php/managing-cron-jobs-with-php-2/


... crontab的:

0 9 * * * /path/to/bashscript 

和/路徑/到/ bashscript:

#!/bin/bash 
maxdelay=$((1*60)) # every hour, converted to minutes 
for ((i=1; i<=20; i++)); do 
    delay=$(($RANDOM%maxdelay)) # pick an independent random delay, 20 times 
    (sleep $((delay*60)); /path/to/phpscript.php) & # background a subshell, then run the php script 
done 
+2

Cron不會隨機運行 – 2012-08-16 15:56:27

+0

@Mike Brant,它會。 – Homework 2012-08-16 15:58:37

+0

你有沒有提及如何使隨機間隔運行cron作業,因爲我不知道這樣的功能。 – 2012-08-16 16:00:03