每秒记录JSON数据的最有效方法是什么

时间:2018-02-10 20:06:38

标签: php mysql sql json cron

原因

我一直在构建一个从多个JSON源中提取数据的系统。被拉取的数据不断变化,我正在通过PHP脚本记录对SQL数据库的更改。 10次​​中有9次数据不同,因此需要记录。

需要每秒检查一次JSON。我已经成功地每分钟使用一个cron任务,并且PHP函数循环60次。

我现在遇到的问题是我想检查的JSON源越多,PHP文件的运行速度就越慢,这意味着下一个cron get会在前一个完成之前被触发。这一切都开始变得太不稳定和黑客。

问题

假设PHP脚本已经是最有效的,那还有什么可以做呢?

  • 我应该使用多个cron任务吗?
  • 是否应该使用除PHP之外的其他内容?
  • cron任务是否适合此类问题?

任何经验,最佳实践或只是计划旧的帮助将非常感激。

概述

我正在监控正在进行的比赛并记录每个车手,然后每一圈都有一名车手完成。只有当驾驶员越过起跑/终点线时才会记录低位,而我不知道比赛时间是否有效,或者当驾驶员越过线路时。因此,我每隔一秒检查一次要记录的新数据。

竞赛会话可能处于活动状态的每个场所都有一个单独的URL来接收来自的JSON数据。我添加到系统中的场所越多,以监控脚本运行速度越慢。

我目前有19个场地,脚本大约需要12秒才能完成。因为我每分钟都在运行一个cron作业,并且每秒循环一次脚本。我假设我每秒至少运行12个脚本。这对我来说似乎不是最有效的方式。当然,当我只检查一个单一的场地时,它起了作用。

1 个答案:

答案 0 :(得分:0)

您的运营有一个周期。它是。

  1. 通过阅读$starttime = time();
  2. 的时间开始您的流程
  3. 通过花费时间加60秒来计算下一个预定时间。 $nexttime = $starttime + 60;
  4. 做你必须做的操作(阅读一堆json feed)
  5. 计算分钟$timeleft = $nexttime - time();中的剩余时间。
  6. 睡到下一个预定时间if ($timeleft > 0) sleep ($timeleft);
  7. 设置$starttime = $nexttime
  8. 跳回到第2步。
  9. 显然,如果$timeleft是负面的,那么你就无法跟上你的测量结果。如果$timeleft总是负数,那么你将会越来越远。

    每分钟使用cron可能是浪费,因为它需要资源来启动新进程并使其继续运行。您可能希望永久运行您的进程,并使用监视它的shell脚本并在崩溃时重新启动它。

    这一切都非常明显。不太明显的是,您应该在整个测量周期内跟踪每分钟的个人$timeleft值。如果它们每天变化,您应该追踪一整天。如果每周变化,您应该追踪一周。

    然后你应该看看$timeleft的最差(最小)值。如果你的第95百分位数小于15秒,那么你的资源就会耗尽,你需要采取行动。您需要15秒的保证金,因此您的系统不会过载。

    如果您的系统对后期数据采样具有零容忍度,您应该查看$timeleft的单个最差值,而不是第95个百分点。你应该给自己一个比15秒更大的余地。

    所谓的硬实时系统为每个操作分配一个时隙,如果操作超过时隙则崩溃。在您的情况下,时间段为60秒,操作正在读取一定数量的Feed。崩溃是非常激烈的,但测量是强制性的。

    最简单的操作是开始运行多个工作进程。为每个流程提供一些Feed。 php运行单线程,因此多个进程可能会有所帮助,至少在你得到其中的三个或四个之前。

    然后,您需要添加另一台计算机,并在多台计算机上的工作进程之间划分您的源。

    比php更快地解析JSON的语言环境可能有所帮助,但前提是解析JSON所花费的时间比等待它到达的时间更重要。