【问题标题】:Script has to be executed X times in 24h. How do I randomize that?脚本必须在 24 小时内执行 X 次。我如何随机化?
【发布时间】:2012-06-01 20:41:03
【问题描述】:

我有一个 PHP 脚本,它可以在几秒钟内完成一些事情(长时间不运行)。我需要执行此脚本,假设,每天执行 12 次(这可能会改变)。 24 / 12 = 2 小时。

我可以每 2 小时执行一次脚本,但我需要在 24 小时内随机执行一次。

这意味着脚本不必在 01:05 PM、03:05 PM、05:05 PM 执行,而是在 01:37 PM、03:11 PM、05:46 PM。我想你已经明白了重点。很抱歉不是很清楚。

(可以安装 cron 和其他工具(如果需要)。运行 debian 6)

将提供赏金(100 代表)以获得可行的解决方案。

【问题讨论】:

  • 你关心间隔多长时间吗?并且最小数量是 12 或者一天运行的确切次数是 12?
  • @hackartist 这个数字可以是任何数字。通常是30-50。我不在乎执行之间是否有最短时间间隔。
  • 您可以每 15 分钟运行一次 cron,并使用 php 脚本决定是否运行确切的作业,如果时间合适,则应该运行一些时间数组,然后如果不退出作业则运行。
  • 必须每天运行准确 XXX次,还是每天运行大约 XXX次?
  • @wildplasser 1-2 次失误是可以接受的。

标签: php bash cron


【解决方案1】:

我会这样做:设置一个 cron 来告诉它像这样每 2 小时运行一次

0 /2 * * * php youscript.php

这表示每隔一小时运行一次 yourscript.php。然后在 php 代码本身的顶部放置:

sleep(rand(5*60,50*60));

这将使脚本在开始工作前随机暂停 5 到 50 分钟。您可以更改随机数的最小值和最大值,以确保运行之间的时间最短。

如果您希望它运行 24 次,请改为这样做

0 * * * * php youscript.php

甚至一天 48 次

0,30 * * * * php youscript.php

【讨论】:

  • 是的,但是如果我必须每天执行 50 次而不是 12 次呢?我刚刚说的是 12,所以更容易理解我的需求 :)
  • 这显示了如何,最简单的数字是 12 的倍数,但您可以看到 here cron 语法是如何工作的(很可能 cron 已经安装在您的计算机上,而您只需编辑指令文件)
【解决方案2】:

您始终可以在 cronjob 开始时sleep(rand(60, 1.5 * 60)) 以抵消其执行。在此期间您将有一个空闲的 PHP 进程,这可能是也可能不是问题。

【讨论】:

  • 是的,您的 cronjob 将在固定时间运行,之后它可以在开始工作之前随机休眠一段时间。
【解决方案3】:

如果您严格必须每天运行 X 次:

  • 手动(或编写一个简单的脚本)将一天分成 X 部分。
  • 为每个部分创建一个 cron 行。
  • 在运行期间随机延迟脚本 0 到 24H/x。

如果没有:

  • Cron 在午夜运行。
  • 使用泊松分布的 PHP 延迟然后处理。
  • 脚本结束运行一个新脚本,除非它的处理时间超过午夜。

【讨论】:

    【解决方案4】:

    假设您希望脚本每天运行N 次。然后创建一个 bash 脚本my_php_runner.bash,如下所示:

    #!/bin/bash
    
    N=12  # 50 times a day
    
    let WAIT_TIME=86400/$N
    
    while [[ $n -gt 0 ]]; do
        php yourscript.php
    
        # Sleep for $WAIT +/- 300 seconds
        sleep $(( $WAIT - 300 + $RANDOM%600 ))
        ((n--))
    done
    

    它将运行您的脚本 12 次,每次运行之间等待 115 到 125 分钟。然后添加类似

    0 0 * * * my_php_runner.bash
    

    cron 中每天运行一次 bash 脚本。

    【讨论】:

    • 其实,这是一个非常好的主意。但在 N=50 的情况下,睡眠 +- 300 秒会太多,因此脚本不会执行 50 次。
    • 是的。为简单起见,我对 300 进行了硬编码,但您可以将其设为 WAIT_TIME/10 之类的。
    猜你喜欢
    • 2020-03-05
    • 2011-07-20
    • 2014-03-25
    • 1970-01-01
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多