2012-08-16 92 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