如何更新大型JSON文件的本地副本?

时间:2014-10-09 17:29:04

标签: php json

我正在编写一个基于php的网站,它需要来自其他网站的json表。它是一个相对较大的文件,几乎没有得到更新,所以我最好保留一个本地副本并使用它,而不是经常请求他们的服务器获取相同的文件。

但是我确实需要他们的json文件的最新版本,否则很多我的网站链接都会破坏。

我是网络开发的新手,所以我不确定如何处理这个问题。我已经读过像Redis和Memcaching这样的内容,但我不确定这是我正在寻找的内容,也不知道如何让它发挥作用。

如何让我的json文件的本地版本保持最新状态,还是有更好的方法?

2 个答案:

答案 0 :(得分:0)

通常在这种情况下,您每隔X小时就会请求该文件的更新副本并将其存储在您的服务器上。
在实践中:在每个页面加载时,你检查该文件的年龄(filemtime());如果它超过X小时,则再次下载并替换缓存文件的内容 X ,小时数,必须根据更新原始文档的频率进行调整。例如,如果您知道文档每6小时更新一次,则可能需要每隔2小时刷新一次(X = 2)。

你应该准备好拥有一个过时的缓存,但是:在任何时候你的缓存文件都可以长达X个小时(例如,如果你下载文件并且网站管理员在1分钟之后取而代之,那么你的缓存文件将会过时X小时不到一分钟。)

有一些方法可以改善这个过程:

  1. 如果文件非常大,在准备网页时下载它以回复访问者可能是一个非常糟糕的主意。实际上,访客讨厌等待,每生成页面所花费的时间越多,访问者就越有可能离开并失去兴趣。 There are studies about that(具有讽刺意味的是,那个页面花了我几秒钟加载:) - 同时我回到这个标签键入)。
    解决方案:有一个后台作业,定期刷新缓存的文件。您可以使用cron执行此操作;如果您无权访问cron,还有其他方法可以在PHP中模拟它。例如,请参阅the guys at TechCrunch提出的内容。
  2. 您可以(如果远程服务器支持)首先发出请求以查看文件是否已更改,而不是每次都下载整个文件。使用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);