每隔一天运行一次php脚本

时间:2018-12-03 23:05:41

标签: php sql

问题
我希望我的PHP代码段从用户首次执行该功能的日期起每隔一天执行一次。这并不困难,但是这里有一些限制条件,我需要一些帮助:

  1. 如果用户以后再次登录,则该功能只能在任何两天的间隔内运行一次,以停止多次运行。

  2. 我希望该功能在任何错过的日子都能“赶上”。因此,如果4天过去了,那么我希望该功能运行两次。这里的问题是如何计算奇数天(例如,如果经过3天又剩下一天,代码是否应该运行两次?)。

我当前(无效)的解决方案
当前,我使用SQL查询来为函数的$ initial_run和$ last_run派生变量。这些变量表示已过的天数,因此$ initial_run = 6表示自函数首次执行以来已过六天(对于不同的用户可能有所不同),而$ last_run = 3表示自函数首次执行以来已过三天该函数上次运行。我一直在尝试使用变量的组合来实现我上面想要的方案,但是这是我遇到的问题。下面的代码只是我到目前为止的示例尝试。

//in the below example scenario I would want the code to run twice
$initial_run = 6; //6 days
$last_run = 4; //4 days

for ($x = 0; $x < $last_run / 2; $x++) {
    //code needs to 'catch up' on missed days 
    //(i.e. run twice if 4 days have passed since $last_run)

    if ($last_run >= 2 and $initial_run % 2 == 0) {
        //code to only run once within a two day interval
    }
}

任何帮助将不胜感激,我知道我可以使用SQL事件来实现这一点,但是出于我的目的,如果有人可以在PHP本身内为我提供一个很棒的解决方案。不一定只使用我上面概述的变量,它们只是用来说明到目前为止我已经尝试过的。我愿意接受替代方案,但正如我希望说的那样,可以使用PHP解决方案。

谢谢。

1 个答案:

答案 0 :(得分:0)

  

如果用户稍后再次登录,则该功能只能在任何两天的间隔内运行一次,以停止多次运行。

     

我希望该功能在任何错过的日子都能“赶上”。所以如果4   天已经过去了,那么我希望该功能运行两次。的   这里的问题是如何计算奇数天(例如代码是否应该运行   如果3天过去了又有一天还剩下2天呢?)。

无需确切地知道要实现的目标,就可以非常简单地满足您的要求:

思考“第二”。您想每172.800秒(即两天)运行一次脚本

所以:

  • 如果用户是第一次登录,请将(数据库)值设置为当前的datetime,将其命名为lastRun
  • 在下次登录时,您将以秒为单位计算与存储的值lastRun相比的差异。

对该值执行172.800的整数除法,就可以计算出现在需要执行脚本的频率(只是数学运算,请看整数除法:http://mathworld.wolfram.com/IntegerDivision.html / http://php.net/manual/en/function.intdiv.php):

Difference in Seconds | ScriptExecutionTimes | Integer Division "Seconds \ 172800"
< 172.800               Don't run it           0 
[172.800 - 345.599]     Run it Once            1
[345.600 - 518.399]     Run it two times       2
...

每次执行时,将lastRun的值增加172.800秒。

这样,无论用户连续2天或300天未登录,还是服务器连续数天停机,您都将不会错过任何运行。