【问题标题】:Need code critique for time interval test script PHP需要对时间间隔测试脚本 PHP 进行代码评论
【发布时间】:2010-08-19 22:14:20
【问题描述】:

又来了!我正在尝试编写一组脚本,这些脚本仅在自上次运行以来已超过 15 分钟时才会在页面上运行。基本上,一个自动化脚本每半小时更新一次我的数据库——显示该信息和更新会话变量的页面显然必须在打开数据库时查询数据库。

因此,为了最大程度地减少查询并保持安全,我认为会话变量只有在自上次查看该页面后超过 15 分钟时才会从数据库中更新。我写了一些代码,希望你们在我尝试实现之前先看看它?

if(!isset($_SESSION['time_next'])){

    $_SESSION['time_next'] = time() + (15 * 60);
                                     //15 minutes   
}
else if(time() >= $_SESSION['time_next']){

    //update all the session variables, etc...

    $_SESSION['time_next'] = time() + (15 * 60);    
}

你怎么看?这行得通吗?

【问题讨论】:

  • 您知道每个用户都有自己的会话数据集吗?如果有 100 人查看此页面,您的代码最终会为每个人每 15 分钟运行一次。如果你想每 15 分钟运行一次,你应该使用类似数据库的东西。或者,更好的是,只需使用 cron。
  • 是的,我想——这实际上是必要的。这个项目有点像一个网络应用程序,所以同时使用它的每个用户都需要从数据库中访问他们自己的特定数据。基于对每个用户不同的一系列因素,他们的数据可能会以不同的方式显示。所以本质上,是的,脚本需要根据每个用户自己的时间表更新,因为每个用户会看到不同的数据。
  • 哦,对不起,我误解了你的回答。是的,数据库上已经有一个 CRON 脚本,它每 30 分钟更新一次。每个个人用户都访问该数据,并将其放入一些显示的会话变量中(并在其他页面中使用)——因此,如果他们导航到不同的页面然后返回,那么此时的数据可能会有所不同。我正在努力做到这一点,因此每次他们返回该页面时都不会查询数据库,仅当它是 15 分钟时才查询,因为我的 30 分钟自动脚本很可能不会在 15 分钟的时间范围内运行。

标签: php time timestamp intervals


【解决方案1】:

它会起作用,但你可以写得更短更简洁*。请注意,会话是受访问者限制的,因此当 10 人请求该页面时,您将获得 10 个运行更新的实例。

do_update_if_needed(15);

function do_update_if_needed($minutes)
{
    if ( isset($_SESSION['time_next']) && time() < $_SESSION['time_next'] ) return;

    // either time_next was not set, or it's time to update, so set next time:

    $_SESSION['time_next'] = time() + $minutes*60;

    // do your thing!
}

您还可以编写一个包含上次时间(或使用其上次修改时间)的简单文件。总的来说,我认为记录 last 时间比记录 next 时间更好,因为 last 时间实际上说明了已经发生的事情,而不是只是“一个计划”(这会引发一些问题,比如是谁的计划?为什么?等等)

*cleaner 指的是:1)把它放在一个函数中,2)在一个地方做计算,而不是在if的两个分支中

【讨论】:

  • 完美。同样,我肯定知道该脚本将运行 10 次,但它对应用程序的功能非常关键。你的代码看起来确实比我的更有效率。非常感谢!
  • 哇,实际上,是的,经过仔细检查,这比我的要好得多。再次感谢!
【解决方案2】:

您可能想为这类事情创建DAEMONS

正如其他人所解释的那样,您绝对不应该走自己的路

您还不应该使用 cron,因为如果该过程花费的时间超过您认为它应该花费的时间,它将超过另一个过程。这可能会使您的应用程序变得一团糟,而且这确实不是一个优雅的解决方案。

deamon 将以静默方式在后台运行。将处理您需要的所有工作量,不会覆盖自身,还可以在预设的时间内运行。

Take a look at this excellent tutorial by Kevin van Zonneveld.

【讨论】:

  • 如果我自己不托管网站,我该如何安装守护进程?虽然每半小时自动执行一次的脚本非常简单,而且用户每次加载“仪表板”页面时访问的脚本只是检索数据以供查看,但这似乎确实是一条路……我不知道,我想我在我头上......
  • @user405056 好吧......也许你是。如果你不需要,不要过度复杂化。只需写一个关于Daemons 的心理笔记,当确实出现了一个很有可能解决问题的问题时,你就会知道要走的路! ;)
  • 是的,我想是的!也许当我的应用程序有 60 亿用户并且我在数亿美元中游泳时,我可以找出一个守护进程哈哈哈!无论如何,我会认真阅读——再次感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-07
  • 2018-07-20
  • 2017-07-20
  • 2014-03-27
  • 1970-01-01
相关资源
最近更新 更多