【问题标题】:How can I get only a part of a json file instead of the entire thing with php?如何只获取 json 文件的一部分而不是使用 php 的全部内容?
【发布时间】:2014-11-28 10:07:26
【问题描述】:

我正在连接到 trakt.tv api,我想为自己创建一个小应用程序,显示带有评分等的电影海报。

这是我目前用来检索他们的 .json 文件的文件,其中包含我需要的所有信息。

$json = file_get_contents('http://api.trakt.tv/movies/trending.json/2998fbac88fd207cc762b1cfad8e34e6');
$movies = json_decode($json, true);

$movies = array_slice($movies, 0, 20);

foreach($movies as $movie) {
    echo $movie['images']['fanart'];
}

因为 .json 文件很大,所以加载速度很慢。我只需要文件中的几个属性,例如标题、评级和海报链接。除此之外,我只需要前20个左右。如何确保只加载 .json 文件的一部分以加快加载速度?

除此之外,我没有将 php 与 .json 结合使用的经验,所以如果我的代码是垃圾并且您有建议,我很想听听。

【问题讨论】:

  • 这会涉及更多。您需要一个 JSON-stream-decoder,即可以让您在 JSON 数据流入时对其进行解码的东西,而不是一次需要整个数据。然后,您将开始下载 JSON 数据,在进行过程中对其进行解码,并随时停止该过程。我不知道有哪个特定的库可以做到这一点,但我确信它们存在。
  • 此外,响应相当很慢(对我来说大约需要一秒钟),因此您可能需要定义“加载速度很慢”。也许不是你的php代码而是api?

标签: php json file api


【解决方案1】:

除非 API 提供 limit 参数或类似参数,否则我认为您不能限制查询。快速浏览一下,它似乎没有提供这个。它看起来也没有真正返回那么多数据(低于 100KB),所以我猜它只是很慢。

鉴于 API 速度较慢,我会缓存您收到的数据,并且每小时只更新一次。您可以使用file_put_contents 将其保存到服务器上的文件中,并记录保存时间。当您需要使用数据时,如果保存的数据超过一个小时,请刷新。

这个想法的快速草图有效:

function get_trending_movies() {
    if(! file_exists('trending-cache.php')) {
        return cache_trending_movies();
    }

    include('trending-cache.php');
    if(time() - $movies['retreived-timestamp'] > 60 * 60) { // 60*60 = 1 hour
        return cache_trending_movies();
    } else {
        unset($movies['retreived-timestamp']);
        return $movies;
    }
}

function cache_trending_movies() {
    $json = file_get_contents('http://api.trakt.tv/movies/trending.json/2998fbac88fd207cc762b1cfad8e34e6');
    $movies = json_decode($json, true);
    $movies = array_slice($movies, 0, 20);
    $movies_with_date = $movies;
    $movies_with_date['retreived-timestamp'] = time();
    file_put_contents('trending-cache.php', '<?php $movies = ' . var_export($movies_with_date, true) . ';');
    return $movies;
}

print_r(get_trending_movies());

【讨论】:

  • 甚至可以使用var_export 来缓存已经解析的json。无需多次解析。
  • 更好的是:使用后台任务刷新数据,因此前端将只访问缓存的数据而无需等待。
  • Cron 作业是我最初的想法,但这是基本想法。鉴于 OP 在 PHP 方面没有太多经验,我认为这将是一个很好的起点。
  • @ZougenMoriver 是的,这就是我的意思。 ;)
  • 谢谢 我还没有考虑缓存它,这似乎是最好的选择。谢谢你们的帮助,不胜感激。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-17
  • 1970-01-01
相关资源
最近更新 更多