2015-08-26 51 views
1

我有一个脚本PHP,它在MYSQL服务器上做请求,我想每天执行一次!在不同的时间每天执行一个php脚本

我第一次自己执行脚本。 我希望脚本在执行结束时选择一天中的一个随机时间,在上午8:30到下午7:30之间,并在此时自动重新执行。可能吗?

要选择一个随机时间我已经编码是这样的:

$tomorrow = new DateTime(date('Y-m-d H:m:s', time()+86400)); 
$tomorrow1 = $tomorrow -> setTime(8,30,0); 
$tomorrow2 = $tomorrow -> setTime(19,30,0); 

$min_time = strtotime($tomorrow1->format('Y-m-d H:m:s')); 
$max_time = strtotime($tomorrow2->format('Y-m-d H:m:s')); 
$rand_time = rand($min_time, $max_time); 

但后来我不知道怎么在这个时候脚本做一个自动执行。也许我可以这样暂停:

sleep ($rand_time - time()); 

但是我不知道该如何重新执行脚本。我不认为睡眠是最好的解决方案。你是否有办法,如何做到这一点?

+1

您可以使用cron执行此任务。运行脚本一次和完成脚本之前,应测试crontab,如果当前脚本已经存在它列出并删除脚本,如果需要。然后在新的执行时间内将脚本再次添加到cron中。 –

+1

使用linux? http://stackoverflow.com/questions/9049460/cron-jobs-and-random-times-within-giving-hours – rlanvin

+0

或在7:30通过cron启动它,让它在0到1小时之间随机休眠,然后执行任务。 – syck

回答

0

好吧,我可以使用cron,但问题仍然存在:我需要能够通过php文件本身修改日常工作后的任务调度程序!

0

例如, APT::Periodic是在固定的时间开始工作(在你的情况下是08:30),然后随意休息一段时间作为工作中的第一个命令(在你的情况下为$(($RANDOM % 39600))秒,假设你的shell是Bash)。

这可以避免将任何内容写入crontab。

我不知道PHP,但我认为这会看起来像:

#/usr/bin/php 
// Wait 0-11 hours before starting (invoked by cron at 0830) 
sleep(rand(0, 39600)); 
// It's now a time between 0830 and 1930 

// rest of your code here 

和你的crontab将不会简单地

30 8 * * * /path/to/my/script 

另外,不睡觉都在您的脚本,但在crontab命令中进行睡眠:

SHELL=/bin/bash 
30 8 * * * sleep $(($RANDOM % 39600)) && /path/to/my/script 

如果您需要手动执行脚本(并且不想等到11小时才能启动),这可能会更好。

+0

谢谢你的答案! APT :: Periodic是什么意思?这是否也是一个cron的工作,从8点30分开始睡觉? – dam

+0

'APT :: Periodic'是'aptitude'软件包管理器的一项功能,可以每日下载更新的软件包。为防止归档服务器超载,安装不应该全部使用同一时间进行更新。所以他们在同一时间开始(对于给定的系统时区),但在开始之前等待0到30分钟之间的随机时间。了解我的答案并不重要,这就是我忽略细节的原因。如果需要,请参阅Debian Wiki上的[Unattended Upgrades](https://wiki.debian.org/UnattendedUpgrades)以获取更多信息。 –

相关问题