每天 24 小时每小时发送 15 次消息

Sending messages 15 times a 24-hour day hourly

我有一个 CRON 作业,它每小时启动一次并发送消息。如果它每小时启动一次,那么它一天发送 24 次消息。用户可以设置不同的 CRON 作业启动次数 - 如果他选择 12 次,cron 作业将按照以下模式每隔奇数(或偶数)小时运行一次:

其中 1 是工作的小时数,0 是空闲时间。问题是我不知道如何让一个程序在所有其他时间自动锻炼这种模式,比如 15 或 17 或其他。对于此类用户输入,模式将是:

最后几个小时被打破(大概是 111 或 100)。我试图将 15 除以 24,加 1,然后将它与自上次发送以来的小时数进行比较(如果 1<1.5 则不发送,2>1.5 则发送)但我每次都以 101010 模式结束。不幸的是,我不能每分钟 运行 CRON,它仅每小时启动一次。谢谢。

假设您只想制作一个 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,等等...

根据您尝试执行的操作,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

注意:我认为这是一个差一错误,但你应该从中得到要点..