设计重复PHP / MySQL任务

时间:2012-07-17 13:59:29

标签: php mysql recurring delayed-execution

我有一个设计头疼,我正在使用PHP和MySQL与Java(我的项目是一个Android应用程序)。我必须决定如何定期运行一系列服务器端计算。这里有很多关于如何创建cron作业的材料,这很好,我很可能会在那里结束,但我不确定如何在更广泛的意义上解决我的项目的这一部分。

应用程序完全以用户的地理位置为中心。它们总是以4到40之间的任意簇组织,这些簇在我的数据库中形成一个实例记录。这些实例可以随时变为活动或非活动状态。

任务

对于我的数据库中的每条记录,或者,我更喜欢实例,在每个时代,我想从其用户位置重新计算实例的质心(这很容易,特别是使用标量方法,因为它们非常接近),有效通过更新实例的数据库中的纬度和经度值来移动实例本身的位置。用户随后会在回家时定期收到这些新的实例质心坐标。

方法

由于我缺乏经验,这就是它变得混乱的地方。我开始时编写了一个相对简单的计算,涉及一个SQL选择查询和一个后续的SQL更新操作,每个实例,在每个时期。如果我们假设现在大约20-30秒的更新间隔,那不到一分钟,显然这违反了cron作业1分钟的限制。 (应该注意的是,如果绝对必要的话,时期之间的时差可以是硬编码的。)

在短期内,由于实例/集群很少,这个过程可能只需要花费的时间可以忽略不计。但是,如果实例的数量达到数千个,那么它可能会堆积很多SQL查询并且需要花费大量时间来处理所有计算...为了减少不必要的负载,我自然想要结合一些机制来排除非活动实例,但我想仍然可以想象所需的计算时间可能超过时期间隔。我想这是(很多)以后的问题。

问题

现在看来,问题是双重的:

  1. 我想为所有活动实例执行相同的简单函数 在每个时代。那么,有没有更有效的方法来做到这一点 运行那么多次迭代?我可以以某种方式更新许多表行 一次,使用一个大的,最终的SQL更新查询?是这样的 mysqli_multi_query()在这里真的很有用吗? (此时我没有mysqli)。
  2. 如何才能最好地实现计时器或触发机制重新启动 这个过程在每个时代,因为它可能违反了1分钟 限制我一直在阅读关于cron工作的事情吗?
  3. 我的想法

    我目前的做法如下:

    1. 运行一个SQL select查询,为当前纪元设置全部, 获取需要进行质心转换的实例ID号。
    2. 使用那些实例ID
    3. 填充PHP数组
    4. 使用循环和一个或非常顺序地移动每个实例 许多SQL更新(见上文)将新坐标对写入数据库。
    5. 安排在每个时代执行此任务(换句话说, 每隔x秒)
    6. 上述方法听起来有效吗?在这一点上,我打算这样做,除非有更好的建议。我真的没有办法确定如何安排在每个时期执行任务(第4点),但是......我看了很多地方,我自己无法解决这个问题没有一些指导,我还不是很好。 :)一如既往,任何建议将不胜感激。

1 个答案:

答案 0 :(得分:4)

您可以考虑根据需要从预定任务转移到更新。这很容易实现,但需要权衡。

  • 添加名为Last Updated

  • 的日期时间字段
  • 每次查询对象时,请检查上次更新的字段 “新鲜度”(在您的情况下,如果它>大于30秒前)

  • 如果是新的,请将数据发送给用户。

  • 如果不是新鲜的,请重新计算数据并将其保存到数据库中 (确保更改上次更新的字段)。然后,发送新的 数据给用户。

这将消除对预定任务的需求。摆脱每行更新的浪费。但是,它可能会减慢对用户的响应。