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

时间:2013-10-30 14:54:02

标签: php apache cron crontab plesk

我正在开发一款显示英超联赛足球比赛现场比分的移动应用程序。当游戏开始时,我想每30秒查询一次外部API以检索最新的分数。大多数游戏星期六的3pm开始,但有些游戏从12.45pm开始,其他游戏从1.30pm开始,2pm3pm在星期日开始,有些开始于本周8pm的最新时间。

我的数据库中有一张表,其中包含了本赛季的所有赛程以及他们开始的时间。

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

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

3 个答案:

答案 0 :(得分:2)

根据你的一条评论判断

  

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

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

在这种情况下,我建议您与托管服务提供商进行双重检查,以了解您可以运行的cron作业数量/ cron作业允许的最低频率限制。如果对cron作业的处理有限制,您可以使用在线cron调度程序(如this)。请注意,外部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)如果任何游戏在此(3)睡眠时间为21秒,则从第二天的21:46到12:44。您可以为每个游戏生成一个单独的子进程,这样您就不必在此脚本中每30分钟执行一次(2)睡眠。

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

这里的优化可能是每天使用cron作业(在最后一场比赛结束后停止 - 无论是21:46还是4:30)和restart it如果不是已经停止运行

答案 1 :(得分:1)

如你所建议的那样,只有一个cron作业可以更简单地查找游戏开始时间,然后为每个游戏开始一个游戏,这个游戏在整个游戏期间运行,循环到游戏结束了,在循环的底部睡了30秒。

答案 2 :(得分:1)

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

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

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