Php 用于检索实时运动成绩的Cron设置

Php 用于检索实时运动成绩的Cron设置,php,apache,cron,crontab,plesk,Php,Apache,Cron,Crontab,Plesk,我正在开发一个移动应用程序,可以显示英超足球赛的实况比分。当游戏开始时,我希望每30秒查询一次外部API以检索最新的分数。大多数比赛在周六下午3点开始,但一些比赛在下午12点45分开始,其他比赛在周日下午1点30分、下午2点和下午3点开始,还有一些比赛在一周的最后时间晚上8点开始 我的数据库中有一个表格,里面有本赛季的所有赛程以及赛程开始的时间 所以我猜我需要一个cron,它在12.45和8pm之间每隔15分钟运行一次(游戏在这些时间之外永远不会启动),检查我的数据库,看游戏是否正在启动。然后,

我正在开发一个移动应用程序,可以显示英超足球赛的实况比分。当游戏开始时,我希望每30秒查询一次外部API以检索最新的分数。大多数比赛在周六下午3点开始,但一些比赛在下午12点45分开始,其他比赛在周日下午1点30分、下午2点和下午3点开始,还有一些比赛在一周的最后时间晚上8点开始

我的数据库中有一个表格,里面有本赛季的所有赛程以及赛程开始的时间

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


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

可能更简单的方法是只使用一个cron作业,如您所建议的,它查找游戏开始时间,然后为每个游戏启动一个作业,该作业在整个游戏期间运行,循环直到游戏结束,然后在循环的底部休眠30秒。

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

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


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

从你的一条评论判断

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

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

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

因此,我假设您的cron作业正在工作,并且没有任何问题

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

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

Cron作业无法处理这种逻辑,如果match处于启用状态,则只需运行该逻辑,该逻辑就可以转到脚本

然后,您可以从
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:59
21:00-21:45
),假设游戏发生在时间范围
[12.45,21:45]
。这将优化从
12.00-12.45等不必要的运行

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

让我们调用脚本
updateMatchesAndScores.php
。如果没有游戏开启,则在此(1)15分钟内使用睡眠功能;如果有游戏开启,则在此(3)睡眠时间为21:46至第二天12:44,则为30秒。您可以为每个游戏生成一个单独的子进程,这样您就不必在这个脚本中每隔30分钟实现(2)个睡眠

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


这里的优化可以是每天使用cron作业运行流程(在最后一场游戏结束后停止-无论是21:46还是4:30),如果尚未运行,则相应地运行。

目标平台是什么:IOS(请通知@me我不寻找答案…)?我使用的是一个运行LAMP的共享服务器……根据crontab,你必须将其定义为三行:
4512***命令
*/1513-19***命令
020***命令
多个游戏可以重叠吗?@user1716672我认为是最终的答案。。。您只需要更改时间,但是在php脚本中使用sleep()会占用内存吗?我原以为每30秒执行一个php脚本比执行一个要好,然后睡30秒等等……我不是php程序员,所以我不知道。那么,把它包装成一个shell脚本,然后在那里睡觉怎么样?