我正在编写一个基于php的网站,它需要来自其他网站的json表。它是一个相对较大的文件,几乎没有得到更新,所以我最好保留一个本地副本并使用它,而不是经常请求他们的服务器获取相同的文件。
但是我确实需要他们的json文件的最新版本,否则很多我的网站链接都会破坏。
我是网络开发的新手,所以我不确定如何处理这个问题。我已经读过像Redis和Memcaching这样的内容,但我不确定这是我正在寻找的内容,也不知道如何让它发挥作用。
如何让我的json文件的本地版本保持最新状态,还是有更好的方法?
答案 0 :(得分:0)
通常在这种情况下,您每隔X小时就会请求该文件的更新副本并将其存储在您的服务器上。
在实践中:在每个页面加载时,你检查该文件的年龄(filemtime()
);如果它超过X小时,则再次下载并替换缓存文件的内容
X ,小时数,必须根据更新原始文档的频率进行调整。例如,如果您知道文档每6小时更新一次,则可能需要每隔2小时刷新一次(X = 2)。
你应该准备好拥有一个过时的缓存,但是:在任何时候你的缓存文件都可以长达X个小时(例如,如果你下载文件并且网站管理员在1分钟之后取而代之,那么你的缓存文件将会过时X小时不到一分钟。)
有一些方法可以改善这个过程:
cron
执行此操作;如果您无权访问cron
,还有其他方法可以在PHP中模拟它。例如,请参阅the guys at TechCrunch提出的内容。If-Modified-Since
标头可以实现这一点。请参阅示例this SO question。另一种方法是发出HEAD
HTTP请求并检查上次修改时间。请注意,并非所有服务器都支持这些技巧(特别是如果远程服务器动态生成该文件)。但是,如果它们受支持,您可以减少每个请求之间的时间间隔(上面的 X ),因为您不会每次都下载整个文件。答案 1 :(得分:0)
您可以创建一个evenement,以便在每次发生时进行更新。
然后使用此代码保存文件
//Naming your file
$path= "your path";
$dt = date("d.M.Y");//You can use untill hours or min or seconds, if you planning to many changes "date("F j, Y, g:i a");" http://php.net/manual/en/function.date.php
$dir = $path.$dt;
//Check if file existis or create it
if(!is_dir($dir)){//If dir not exists, create your file
mkdir($dir);
}
else{//Or replace or Update it
$h= opendir($dir);
while($file = readdir($h)){
if($file !="." && $file != ".."){
unlink("$path$dt/".$file);
}
}
closedir($h);
}
$myJSONobject= "your json object";
//Your will store your data as a 1 line string using json_encode
$myJSONstring = json_encode($myJSONobject);
//Now you will open the file you have created and write the string just created
$handle = fopen($dir,"w");
fwrite($handle,$myJSONstring);