根据数据库值,每隔x天/月/年在脚本中执行一次任务


Executing a task within script every x days/months/years, depending on db value

有个问题。我希望用户能够每隔多少小时/天/月/年输入一个脚本。

因此,用户输入两个值-金额(1-24)和单位(小时、天、月、年)。

cron作业每5分钟执行一次脚本文件。在这个脚本中,过滤器应该只允许用户脚本在定义的时间间隔内运行。

可用变量:

  • 金额(1-24)
  • 单位(小时、天、月、年)
  • 脚本开始时间

有人有聪明的方法吗?时间应该相对准确,接近中场休息5分钟。(5分钟,因为cron作业可能延迟)。因此,如果用户说每2小时一次,并在下午2.12点开始,它应该在4.12、6.12等运行

我认为我需要的只是PHP代码,以便灵活地将设置的间隔添加到脚本的开始时间或最后一次执行时间。

谢谢!!!

我的尝试:

    $currentDate = strtotime( date('Y-m-d H:i:s') );
    $dateCreated = strtotime( "2015-12-01 12:16:50" ); // i.e.
    $lastTimeExecuted = strtotime( "2015-12-02 12:16:50" ); // i.e.
    $interval = (1000*60*60)*2; // 2 Hours as timestamp
    if( $lastTimeExecuted > $dateCreated ){
        if( currentDate > ($lastTimeExecuted+$interval) ){
            // Execute Now
        }
    }else{
        // Execute Now, has never been running before
    }

您有一个每5分钟运行一次的cron作业。它应该执行一个PHP脚本,查询数据库,搜索计划作业,执行它们,并更新它们上次运行的时间。数据库中的每个作业都有一个上次运行时的字段。将上次运行时间与当前时间进行比较,以找到经过的时间,如果经过的时间大于频率(另一个字段),PHP脚本将通过systemexecshell_exec执行适当的命令。

脚本看起来像这样:

<?php
    $link=mysqli_connect("host","user","password","database");
    $sql="SELECT * FROM jobs";
    $res=$link->query($sql);
    while($row=mysqli_fetch_assoc($res)){
        $elapsedTime=$date()-strtotime($row['last_run']);
        if($elapsedTime >= $row['frequency']){
            system($row['command']);
            $sql="UPDATE jobs SET last_run='".date("Y-m-d H:i:s")."'";
            $link->query($sql);
        }
    }
?>

请记住,频率以秒为单位。

好的,所以这应该是正在运行的版本:

    // If Job is recurring
    if( $jobRecurring == 1 ){
        $currentDateStr = strtotime( $currentDate ); // i.e. "2015-12-01 12:16:50"
        $dateCreated = strtotime( $jobStartDate ); // i.e. "2015-12-01 12:16:50"
        $lastTimeExecuted = strtotime( $jobLastRunDate ); // i.e. "2015-12-01 12:16:50"
        $jobRecurringUnit; // i.e. "Hours"
        $jobRecurringCalc;
        if( $jobRecurringUnit == "Minutes" ){
            $jobRecurringCalc = 60;
        }
        if( $jobRecurringUnit == "Hours" ){
            $jobRecurringCalc = 60*60;
        }
        if( $jobRecurringUnit == "Days" ){
            $jobRecurringCalc = 60*60*24;
        }
        if( $jobRecurringUnit == "Weeks" ){
            $jobRecurringCalc = 60*60*24*7;
        }
        if( $jobRecurringUnit == "Months" ){
            $jobRecurringCalc = 60*60*24*7*30;
        }
        if( $jobRecurringUnit == "Years" ){
            $jobRecurringCalc = 60*60*24*7*365;
        }
        $interval = $jobRecurringCalc * $jobRecurringAmount;
            if( $lastTimeExecuted < $dateCreated || $currentDateStr > ($lastTimeExecuted+$interval) ){
                 // Execute Now
            }
    }