如何在没有Crontab的情况下每两周在PHP中调用一个方法

时间:2017-04-28 04:29:16

标签: php

我想更新html中的div,每周只用php显示不同的内容,而不使用cron。 如何实现它?以下代码用于在第10天每2个月激活一次代码 但我猜逻辑会有所不同。如果可能的话,一些提示或示例将是伟大的!我很乐意听到你的消息!

    // check if current day is 10th and month is an even number
if (date('d')==10 && date('m') % 2 == 0) {
    // get todays-date (format: yyyymmdd)
    $today = date('Ymd'); 
    // get info about last run
    $last_run = variable_get('my_last_run', 0);
    // check last run was not today
    if ($last_run!=$today) {
        // set last run to today
        variable_set('my_last_run', $today);

        /* Place your code here */

    }
}

6 个答案:

答案 0 :(得分:2)

我刚刚更新了您的示例,现在它将在下周一开始工作:

$weekInYearNumber = (int)date('W');
$weekDayNumber = (int)date('w');
if ($weekDayNumber === 1 && $weekInYearNumber % 2 == 0) {
    // Rest of your code.
}

答案 1 :(得分:0)

如果你不能或不想使用cron作业(这是最简单和推荐的解决方案),你可以创建一个大部分时间都在睡觉的PHP脚本,然后醒来检查日期并运行你需要的任何东西。

如果您不关心约会并且只想每两周运行一次,那么您可以让它像这样睡觉:

 sleep(14*24*60*60);

让您的脚本在此之后执行您的代码,并将所有内容置于无限循环中。然后只需从控制台运行脚本,使其没有执行时间限制。

考虑到脚本可能因为不同的原因而停止运行,例如当服务器重新启动时,因此您应该监视该过程并在未运行或重新启动时自动重新运行它。

答案 2 :(得分:0)

为了每周显示不同的内容,您可以使用此

$week = (int)date('W');
$odd = ($week % 2) === 0;
if ($ood) {
    // First week.
} else {
    // Second week.
}

答案 3 :(得分:0)

如果你想快速做,你可以计算自2018年1月1日以来的几周(因为它是星期一:任何其他一年开始的星期一都没问题),然后检查这个数字是奇数还是偶数:

      $diffBetweenNowAndFirstJan2018 = time() - strtotime("2018-01-01");
      $numberOfWeeksSinceFirstJan2018 = floor($diffBetweenNowAndFirstJan2018 / (60 * 60 * 24 * 7));
      $isNumberOfWeeksOdd = ($numberOfWeeksSinceFirstJan2018 % 2 == 1)

      if($isNumberOfWeeksOdd){
            // it's other week time
    }

在一行中:

     if( ( (floor((time() - strtotime("2018-01-01")) / (60 * 60 * 24 * 7))) % 2 == 1) ){
            // it's other week time
    }

你不应该像弗拉德米尔所说的那样使用日期(' W')因为在新年前夕你可以得到两个"奇怪的"连续一周。

答案 4 :(得分:-1)

这可能适合你。

    Sub DOBdateRange()

    Dim Bfordate As Date
    Dim Afterdate As Date

    Bfordate = Worksheets("error").Range("i5").Value
    Afterdate = Worksheets("error").Range("j5").Value

    Application.ScreenUpdating = False
   'çhange data formate to Date
    Worksheets("data").Select
    Worksheets("data").Range("a2", Range("a" & Rows.count).End(xlUp)).Offset(, 3).Select
    Selection.Name = "DOB"
    Selection.NumberFormat = "d/mm/yyyy"

   'filter and copy how many records match (exclude) date criteria,
    Worksheets("Data").Select
    Range("bq1").Select
    Range(Selection, Selection.End(xlToLeft)).Select
    Selection.AutoFilter
    ActiveSheet.Range(Selection, Selection.End(xlDown)).AutoFilter _
                **Field:=4, _
                Criteria1:="<" & Bfordate, _
                Operator:=xlOr, _
                Criteria2:=">" & Afterdate** 

     Range("a1").Select
     Range("bq1").Select
     Range(Selection, Selection.End(xlDown)).Select
     Range(Selection, Selection.End(xlToLeft)).Select
     Selection.Copy Set NewSheet = Sheets.Add(After:=Worksheets("error"))
     Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,     SkipBlanks:=False, Transpose:=False
    On Error GoTo duplicatesheet3
    NewSheet.Name = "DOBdateRange"
    On Error GoTo 0
    NewSheet.Range("A1").Select
    Application.CutCopyMode = False
    Worksheets("dobdaterange").Range("d:d").Select
    Selection.NumberFormat = "d/mm/yyyy"
    Application.CutCopyMode = False
    Worksheets("dobdaterange").Range("a1").Select
    Range(Selection, Selection.End(xlToRight)).EntireColumn.AutoFit
    With ActiveSheet.UsedRange.Borders
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = xlAutomatic
    End With

    Worksheets("Data").Select
    Worksheets("Data").Range("A1").Select
    Selection.AutoFilter             'Remove auto filter

    Sheets("DOBdateRange").Select

    Exit Sub

答案 5 :(得分:-1)

你确定吗?您的网页将开放2个月?

您可以应用一个逻辑

只需在数据库中保存下一个cron日期即可。所以你的逻辑会喜欢

<?php

if($databaseDate == date()){
   //Perform acetion here
   // Save your next date here
}
?>

我希望这能解决你的问题

如果您不想这样做,那么您可以使用PM2

对于pm2,您需要ssh访问服务器。