我一直在寻找一种解决方案,将多个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>
答案 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),这会让它更快。