问题
我希望我的PHP代码段从用户首次执行该功能的日期起每隔一天执行一次。这并不困难,但是这里有一些限制条件,我需要一些帮助:
如果用户以后再次登录,则该功能只能在任何两天的间隔内运行一次,以停止多次运行。
我希望该功能在任何错过的日子都能“赶上”。因此,如果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解决方案。
谢谢。
答案 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天未登录,还是服务器连续数天停机,您都将不会错过任何运行。