如何将JSON对象缓存到单个文件中以加快页面加载时间

时间:2013-06-16 18:35:37

标签: php json api caching youtube

我一直在寻找一种解决方案,将多个JSON对象缓存到我的服务器上的单个文件中(没有数据库)。这是因为我正在开发一个网站,该网站有多个来自用户YouTube频道的JSON请求,因此这个网页需要一段时间才能加载。

我的PHP文件的一小部分,用于从YouTube发出JSON请求(此json-yt.php文件中有更多JSON请求:

// VNM Jar
$realUserName = 'TheEnijar';
$data = file_get_contents('http://gdata.youtube.com/feeds/api/users/' . $realUserName . '?v=2&alt=json');
$data = json_decode($data, true);
$TheEnijar = $data['entry']['yt$statistics'];

// VNM Jinxed
$realUserName = 'OhhJinxed';
$data = file_get_contents('http://gdata.youtube.com/feeds/api/users/' . $realUserName . '?v=2&alt=json');
$data = json_decode($data, true);
$OhhJinxed = $data['entry']['yt$statistics'];

// VNM Pin
$realUserName = 'ImGreenii';
$data = file_get_contents('http://gdata.youtube.com/feeds/api/users/' . $realUserName . '?v=2&alt=json');
$data = json_decode($data, true);
$ImGreenii = $data['entry']['yt$statistics'];

// VNM Zq
$realUserName = 'Zqonalized';
$data = file_get_contents('http://gdata.youtube.com/feeds/api/users/' . $realUserName . '?v=2&alt=json');
$data = json_decode($data, true);
$Zqonalized = $data['entry']['yt$statistics'];

这是否可能,如果是这样,任何人都可以指出我正确的方向,或者在用户加载页面之前为我提供存储JSON请求的解决方案,JSON向所有不同的YouTube频道发出请求。< / p>

2 个答案:

答案 0 :(得分:3)

说实话,有很多不同的方法可以做到这一点。最简单的方法是创建数据的关联数组,将其序列化并写入文件。

$dataArray = array();

// ...
$data = file_get_contents('http://gdata.youtube.com/feeds/api/users/' . $realUserName . '?v=2&alt=json');
$dataArray['jinxed'] = $data;

$data = serialize($data);
file_put_contents('cache.txt', $data);

拉回来:

$data = unserialize(file_get_contents('cache.txt'));

但是,正如我所说,还有很多其他方法可以缓存请求。选择其中一个取决于你的缓存系统还需要什么。

UPD:不要忘记缓存信息有时会过时,因此您必须每隔一段时间更新缓存。要不保存任何其他值(如缓存时间),请使用filemtime()函数作为缓存文件。

答案 1 :(得分:1)

你可以这样做:

<?php

function getCachableContent($url){
    $hash = md5($url);
    $cacheFile = "/tmp/foo-cache/$hash";
    if ( file_exists($cacheFile) and filemtime($cacheFile) < time() - 300 ) {
        $data = file_get_contents($cacheFile);
    } else {
        $data = file_get_contents($url);
        file_put_contents($cacheFile, $data);
    }
    return json_decode($data);
}

$data = getCachableContent('http://gdata.youtube.com/feeds/api/users/' . $realUserName . '?v=2&alt=json');

但我认为最好使用像redis这样提供过期时间的解决方案。你也可以为临时目录创建一个ramdisk(如果你使用的是linux),这会让它更快。