从您的一条评论来看
主要问题是我在没有 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:59
21: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),如果尚未运行,则相应地重新启动它。