6

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

我的数据库中有一个表格,其中包含本赛季的所有固定装置以及它们开始的时间。

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

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

4

3 回答 3

2

从您的一条评论来看

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

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

在这种情况下,我建议您与您的托管服务提供商再次核对您可以运行的 cron 作业数量/ cron 作业允许的最低频率的任何限制。如果对 cron 作业的处理有限制,您可以使用在线 cron 调度程序(像这样)。请注意,外部 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

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

方法二

使用一次性 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),如果尚未运行,则相应地重新启动它。

于 2013-11-17T05:45:35.487 回答
1

正如您所建议的那样,只有一个 cron 作业可能更直接,它会查找游戏开始时间,然后为每个游戏启动一个作业,在整个游戏期间运行,循环直到游戏结束,并在循环底部睡 30 秒。

于 2013-11-10T23:15:46.640 回答
1

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

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

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

于 2013-11-16T20:43:24.713 回答