Php 如何更新大型JSON文件的本地副本?
我正在编写一个基于php的网站,它需要来自其他网站的json表。这是一个相对较大的文件,几乎从未更新过,因此我最好保留一个本地副本并使用它,而不是不断地向服务器请求相同的文件 但是我确实需要他们的json文件的最新版本,否则我到他们网站的很多链接都会断开 我对网络开发还不熟悉,所以我不知道如何处理这个问题。我读过Redis和Memcaching之类的东西,但我不确定这是不是我想要的,或者如何让它工作Php 如何更新大型JSON文件的本地副本?,php,json,Php,Json,我正在编写一个基于php的网站,它需要来自其他网站的json表。这是一个相对较大的文件,几乎从未更新过,因此我最好保留一个本地副本并使用它,而不是不断地向服务器请求相同的文件 但是我确实需要他们的json文件的最新版本,否则我到他们网站的很多链接都会断开 我对网络开发还不熟悉,所以我不知道如何处理这个问题。我读过Redis和Memcaching之类的东西,但我不确定这是不是我想要的,或者如何让它工作 我怎样才能使他们的json文件的本地版本保持最新,或者有更好的方法吗?通常在这种情况下,您会每X
我怎样才能使他们的json文件的本地版本保持最新,或者有更好的方法吗?通常在这种情况下,您会每X小时请求一份该文件的更新副本,并将其存储在您的服务器上
在实践中:在每次加载页面时,您都会检查该文件有多旧();如果超过X小时,则再次下载并替换缓存文件的内容。
十、 小时数必须根据更新原始文档的频率进行相应调整。例如,如果您知道文档每6小时更新一次,您可能希望每2小时(X=2)刷新一次 但是,您应该准备好有一个过时的缓存:在任何时候,您的缓存文件都可能长达X小时(例如,如果您下载该文件并在1分钟后由网站管理员替换,则您的缓存文件将过时X小时,少于1分钟) 有一些方法可以改进此过程:
解决方案:有一个定期刷新缓存文件的后台作业。您可以使用
cron
;如果您不能访问cron
,那么还有其他方法可以在PHP中模拟它。例如,看看你想到了什么。例如,见。另一种方法是发出HEAD
HTTP请求并检查上次修改的时间。请注意,并非所有服务器都支持这些技巧(特别是当远程服务器动态生成该文件时)。但是,如果支持它们,您可以缩短每个请求之间的时间间隔(上面的X),因为您不会每次都下载整个文件
您可以创建一个事件,以便在每次事件发生时进行更新 然后使用此代码保存文件
//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);
您仍然需要请求他们的完整文件才能获得更新。除非他们提供一份只有更改的副本。即使这意味着每小时/天/周/任何时间一次,您也可以获得文件的新副本并保存它。而redis/memcaching并不是您想要的。您可能只需要获取一个脚本,每隔一段时间获取一次文件并在磁盘上覆盖它。您可以检查文件最后一次修改的时间,如果大于X年龄,则获取新副本。为此,我会使用类似“cron”的东西吗?我相信这是一种自动运行脚本的方式,它能保持文件的更新吗?是的,cron。Cron用于在计时器上运行脚本/程序,计时器可以是获取文件新副本的php脚本。只需知道,如果您每5分钟运行一次(作为一个示例),并且json文件中的链接发生更改,那么在下载文件的新副本之前,您站点上的链接将无效。解决这个问题的唯一方法是更频繁地获取文件,但在什么情况下,不保存任何东西而不是每次都获取它取决于您。而您是否将每个文件存储在单独的目录中?您不需要创建多个文件,只需覆盖现有文件并使用filemtime()检查“mtime”值。是的,我们可以在一个目录中使用多个文件,也可以在不同的目录中使用一个文件。我更喜欢创建不同的目录,其中包含on file(相同的名称)。因此,我可以在创建时存储未来的信息。例如,我这样做是为了备份我的Mysqldatabase,我还存储不同的模型或生成的pdf文件。