用于检索实时体育比分的 cron 设置


Cron setup for retrieving live sports scores

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

我的数据库中有一张表格,里面装满了本赛季的所有赛程和他们开始的时间。

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

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

从您的一条评论来看

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

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

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

从此以后,我将假设您的 cron 作业正在工作,并且它们没有问题。

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

方法1

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

如果匹配仅打开然后运行此逻辑,则 cron 作业无法处理此类逻辑,该逻辑必须转到脚本。

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

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

在网址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

你可以将其分解为多个cron作业(12.45-12.5913:00-20:5921:00-21:45),假设游戏发生在时间范围内[12.45, 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),如果尚未运行,则相应地重新启动它。

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

从您的描述来看,基于 cron 的解决方案听起来不像是最好的方法。

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

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