【问题标题】:how to speed up file_get_contents and json_decode如何加快 file_get_contents 和 json_decode
【发布时间】:2017-05-08 13:26:17
【问题描述】:

我目前正在开发一个粉丝网站(仅出于我的目的),它从不同的 API 获取所有数据,如下所示:

$newjson = file_get_contents(LINK_TO_JSON_HERE);
$newarr = json_decode($newjson);

我的问题是:目前该网站加载了 13 个不同的(巨大的)JSON 文件,这大大降低了网站的速度。加载最多需要 30-45 秒,这实际上是不可接受的,但我试图在优化它之前让它工作。是否可以通过使用其他功能来加快速度?看到其他粉丝网站在 1 秒内加载相同的内容让我不禁发问。
关于功能:我将整个 JSON 加载到数组中,然后取出我需要的信息,这些信息通常不到 JSON 文件文本的 1%。有没有办法在将整个文档加载到数组之前过滤我需要的东西?

提前致谢

【问题讨论】:

  • 如果这是一个 json 数据,你实际上并不需要 php.. 只需加载页面并在 document.ready 上开始从这些文件中获取 json 数据并由 js 使用这就是 Js 好的原因

标签: php json api file-get-contents


【解决方案1】:

JSON 不会减慢您的速度而只是file_get_contents() 的可能性非常高。正确地对您的问题进行基准测试,这样您就不会浪费时间优化错误的东西。

<?php
$start = microtime(true);
$newjson = file_get_contents(LINK_TO_JSON_HERE);
echo 'file_get_contents('.htmlentities($LINK_TO_JSON_HERE).'): '.(microtime(true) - $start).' seconds<br>';

$start = microtime(true);
$newarr = json_decode($newjson);
echo 'json_decode(): '.(microtime(true) - $start).' seconds<br><br>';

无论如何,保持实时数据并获得更好速度的最佳方法是切换到curl_multi_exec()

我不确定这些 API 上数据的更新频率,因此您还可以开发某种缓存机制,每天提取几次数据并将其保存到本地 JSON 文件中。

【讨论】:

  • 感谢您的回答!现在我知道哪些文件加载​​速度最慢。例如eu.api.battle.net/wow/data/character/…(您需要一个 API-Key 才能查看它)需要 4.6 秒才能加载。我现在会调查curl_multi_exec(),也许这可以帮助我。
  • @neverlucky 如果 4.6 秒是您最慢的 API,那么 curl_multi_exec() 最多只能将您的页面加载时间缩短到 4.6 秒。您将需要找到更快的 API 或实施缓存机制。
  • @neverlucky 这个运气好吗?
  • 我以不同的方式解决了它。有些 API 永远不会改变,所以我将它们放入本地 txt 文件中,这样可以更快地读取。我没有为每个字段执行一个请求,而是将它们写入一个 file_get_contents,例如?fields=guild,talents,titles,而不是一个用于?fields=guild,一个用于?fields=talents 等等,这也提高了速度。现在页面加载时间不到 1 秒,低于 30 秒。
  • @neverlucky 不错!如果您觉得我的回答帮助您实现了该结果,请随时接受它:)
【解决方案2】:

这不是函数速度的问题,而是等待对方服务器响应的问题。如果可能,您可以缓存数据。

【讨论】:

  • 这不是问题所在。 @neverlucky 询问有关过滤 JSON 文件的问题,而不是缓存它们。我明白你的意思,但它没有回答问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-20
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多