【问题标题】:Cron setup for retrieving live sports scores用于检索现场体育比分的 Cron 设置
【发布时间】:2013-10-30 14:54:01
【问题描述】:

我正在开发一个移动应用程序,用于显示英超联赛的实时比分。游戏开始时,我想每 30 秒查询一次外部 API 以检索最新分数。大多数游戏在周六从3pm 开始,但有些游戏从12.45pm 开始,其他游戏在周日从1.30pm2pm3pm 开始,还有一些在一周中最晚的时间8pm 开始。

我的数据库中有一个表格,其中包含本赛季的所有赛程及其开始时间。

所以我猜我需要一个在12.458pm 之间每15 分钟运行一次的cron(游戏永远不会在这些时间之外启动),它检查我的数据库以查看游戏是否正在启动。然后,如果有一个游戏开始,另一个 cron 必须开始每隔30 秒查询外部 API 以获取该游戏的最新分数。此 cron 将运行大约 1 hour and 45 minutes

实现这种 cron 设置的最佳方法是什么?我在运行 Plesk 软件的共享服务器上,并且没有对服务器的 ssh 访问权限。

【问题讨论】:

  • 目标平台是什么:IOS(请通知@我我不找答案...)?
  • 我正在使用运行 LAMP 的共享服务器...
  • 对于 crontab 来说,你必须在三行中定义它:45 12 * * * command*/15 13-19 * * * command0 20 * * * command
  • 多个游戏可以重叠吗?
  • @user1716672 我认为this 是终极答案...你只需要改变时代

标签: php apache cron crontab plesk


【解决方案1】:

由您的一位 cmets 判断

主要问题是我在没有 ssh 访问的共享服务器上...

我认为这里的问题是您无法访问命令 shell,只能使用 Plesk 将文件呈现到服务器。因此,为了呈现您的解决方案,您将使用 cron 作业。

在这种情况下,我建议您与您的托管服务提供商再次核对您可以运行的 cron 作业数量/cron 作业允许的最低频率的任何限制。如果对 cron 作业的处理有限制,您可以使用在线 cron 调度程序(如 this)。请注意,外部 cron 服务只允许访问可公开访问的 url,因此您需要相应地编写和部署代码。

因此,我将假设您的 cron 作业正在运行并且它们没有问题。

当游戏开始时,我想每 30 秒查询一次外部 API 以检索最新分数。大多数比赛在周六下午 3 点开始,但有些比赛从下午 12.45 开始,有些比赛在周日下午 1.30、下午 2 点和下午 3 点开始,有些比赛在一周中最迟晚上 8 点开始。

方法一

使用单个updateMatchesAndScores.php 文件更新任何新匹配的匹配信息(在数据库中标记为活动/关闭),并更新当前活动匹配的分数。

如果匹配开启,Cron 作业无法处理这种逻辑,然后运行它,该逻辑必须转到脚本。

然后您可以从 12-10 PM 运行它,如下所示

* 12-22 * * * php -f updateMatchesAndScores.php
* 12-22 * * * sleep 30 && php -f updateMatchesAndScores.php

如果是 url http://some.server.address.com/updateMatchesAndScores,则变为

* 12-22 * * * wget http://some.server.address.com/updateMatchesAndScores
* 12-22 * * * sleep 30 && wget http://some.server.address.com/updateMatchesAndScores

假设游戏发生在[12.45, 21:45] 时间范围内,您可以将其分解为多个 cron 作业(12.45-12.5913:00-20:5921:00-21:45)。这将优化来自12.00-12.45 等的不必要运行。

方法2

使用一次性 cron 作业启动一个守护进程,然后每分钟检查一次它是否仍在运行。

让我们调用脚本updateMatchesAndScores.php。将睡眠功能置于此(1)15 分钟(如果没有游戏)(2)30 秒(如果有任何游戏)(3)从第二天 21:46 到 12:44 睡眠。您可以为每个游戏生成一个单独的子进程,这样您就不必在此脚本中实现 (2) 以每 30 分钟休眠一次。

注意事项 - (1) 脚本的执行时间会开始稍微延迟代码,所以 15 分钟很快就会变成 15 分钟 x 秒 (2) 有一个最大执行时间在php中,因此您必须相应地设置它(3)根据您的代码质量,可能会有内存泄漏对您造成轻微影响。

这里的优化可以是每天使用 cron 作业(在最后一场比赛结束后停止 - 无论是 21:46 还是 4:30)和 restart it 相应地运行该进程(如果尚未运行)。

【讨论】:

    【解决方案2】:

    按照您的建议,只有一个 cron 作业可能更直接,它会查找游戏开始时间,但随后会为每个游戏启动一个运行整个游戏长度的作业,循环直到游戏结束结束,并在循环底部休眠 30 秒。

    【讨论】:

    • 但是在 php 脚本中使用 sleep() 会占用内存吗?我本以为每 30 秒执行一个 php 脚本会比执行一个,然后休眠 30 秒等...
    • 我不是php程序员,所以不知道。那么如何将它包装在一个 shell 脚本中,然后在那里进行睡眠呢?
    【解决方案3】:

    根据您的描述,基于 cron 的解决方案听起来并不是最好的方法。

    最好设置一个守护进程(或类似守护进程),它会定期检查游戏是否开始(例如每 15 分钟一次,扮演您的第一个 cron 作业的角色),并生成一个子进程来执行每个游戏开始的任务(您的第二个 cron 作业的角色)。

    如果你特别喜欢 cron,你可以让一个 cron 作业检查守护进程是否正在运行,如果没有就启动它;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多