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

Php 如何更新大型JSON文件的本地副本?,php,json,Php,Json,我正在编写一个基于php的网站,它需要来自其他网站的json表。这是一个相对较大的文件,几乎从未更新过,因此我最好保留一个本地副本并使用它,而不是不断地向服务器请求相同的文件 但是我确实需要他们的json文件的最新版本,否则我到他们网站的很多链接都会断开 我对网络开发还不熟悉,所以我不知道如何处理这个问题。我读过Redis和Memcaching之类的东西,但我不确定这是不是我想要的,或者如何让它工作 我怎样才能使他们的json文件的本地版本保持最新,或者有更好的方法吗?通常在这种情况下,您会每X

我正在编写一个基于php的网站,它需要来自其他网站的json表。这是一个相对较大的文件,几乎从未更新过,因此我最好保留一个本地副本并使用它,而不是不断地向服务器请求相同的文件

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

我对网络开发还不熟悉,所以我不知道如何处理这个问题。我读过Redis和Memcaching之类的东西,但我不确定这是不是我想要的,或者如何让它工作


我怎样才能使他们的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文件。