我有一个CRON作业,每小时开始并发送消息。如果它每小时开始一次,它每天发送24次消息。用户可以设置CRON作业可以开始的不同次数 - 如果他选择12次,则cron作业将按以下模式每隔奇(或甚至)小时工作:
其中1表示小时工作,0表示空闲时间。问题是我不知道如何使节目锻炼这样的模式自动所有其他时间,比如15或17或其他东西。对于此类用户输入,模式将为:
最后几小时被打破(这将是111或100)。我试图将15除以24,加1,然后将其与自上次发送后的小时数进行比较(如果1 <1.5然后不发送,2> 1.5然后发送)但我每次都以101010模式结束。不幸的是,我不能每分钟运行CRON,它只在每小时开始。谢谢。
答案 0 :(得分:2)
根据您的尝试,cron作业运行的频率越高,您的时间就越准确。如果它每小时都有,那么用户在17到24之间选择的任何东西都会每小时执行一次。因此,即使提供所有这些选项也没有意义。如果您必须让用户选择一个数字并在一天中均匀执行,那么您必须比一小时更频繁地运行cron作业。
此示例假定您每分钟运行一次cron作业,即:
*/1 * * * * <your command>
// How many times per day, get from DB
$userInput = 17;
$SecondsPerDay = 60 * 60 * 24;
$Frequency = (int) ($SecondsPerDay / $userInput) -1;
$midnight = strtotime('today midnight');
// Get an array of times to execute
$executeTimes = array();
for($time=$midnight; $time<=($midnight+$SecondsPerDay); $time+=$Frequency)
$executeTimes[] = date("g:i a", $time);
$currentTime = date("g:i a");
$execute = in_array($currentTime, $executeTimes);
if(!$execute) exit;
// Cron job codes here
这是一个例子:https://3v4l.org/0PCXh
注意:我认为这是一个错误的错误,但你应该从中获得要点..
答案 1 :(得分:0)
假设你想要的只是制作一个0和1的模式,用户选择1应该出现的频率并且它们是均匀间隔的......
你想要24个总数字。假设$n
是事件之间的小时数。所以,$n=1
表示每1小时一次。然后,每当小时可以被事件之间的小时数整除时,只需使用1 ......
$pattern = '';
for($h=1; $h<=24; $h++)
$pattern.= ($h%$n==0) 1 : 0;
如果$ n = 1(每小时),这将给你111111111111111111111111。它将是0101010101 ...如果$ n = 2。如果$ n = 3等,它将是001001001001 ......