PHP缓存本地文件中的外部JSON API - 无法正常工作

时间:2017-07-02 15:00:24

标签: php json caching highcharts

我在我的网站上显示Highcharts,可视化外部API的数据。我不想在每个网页浏览中调用此API,而是将检索到的数据本地存储在缓存文件中。然后,访问该页面的下一个用户应该从该本地缓存文件获取Highcharts数据,而不是API URL(为了减少API调用和Highcharts加载时间)。缓存文件应该被认为是最新的60分钟。

我在5-minute file cache in PHP找到了答案,但它对我不起作用。

我基本上将代码复制到我自己的php文件中:

....
//to be sure about the correct file path, 
//I used here the absolute URL of my site: "https://www.example.com/path/to/my/cache.json"
$cache_file = "path/to/my/cache.json";

$api_url = "http://www.someapi.com/api";

if (file_exists($cache_file) && (filemtime($cache_file) > (time() - 60 * 60 ))) {
// Cache file is less than 60 minutes old. 
//Don't bother refreshing, just use the file as-is.
    $json = file_get_contents($cache_file);

} else {
//Our cache is out-of-date, so load the data from our remote server, 
//and also save it over our cache for next time.
    $json = file_get_contents($api_url);
    file_put_contents($cache_file, $json);
}

//decode JSON to array
$data = json_decode($json,true);
....

当我加载我的网站时,Highcharts会显示结果,但显然只有API网址。我的 cache.json 文件仍为空。我给它chmod 777,所以我做了父目录 data dataCache

为了测试代码,我尝试通过对行进行注释来调试

//$json = file_get_contents($api_url);

然后,Highcharts根本不显示任何数据。所以我了解到IF循环有些工作 - 但不是应该的方式。

然后我从API响应中复制了JSON数据,并将其保存到我的 cache.json 文件中。现在我对该行进行了评论

//$json = file_get_contents($api_url);

我希望因为我有一个新创建的 cache.json 文件,所以会满足第一个IF条件,因此Highcharts会从我的缓存文件中检索数据。然而,这并没有发生。 Highcharts不再显示任何数据。

你能帮我理解为什么代码不起作用(虽然我基本上从这里5-minute file cache in PHP复制了它)?

P.S。:我不确定这可能只是一个"重复"题。但由于原始问题的答案对我不起作用,我不确定如何/在哪里提问。

1 个答案:

答案 0 :(得分:0)

您的问题可能是外部网址。

根据file_put_contents documentation

  

提示
  如果已启用fopen包装,则可以将URL用作具有此功能的文件名   有关如何指定文件名的详细信息,请参阅fopen()   有关各种包装器具有哪些功能的信息,使用说明以及它们可能提供的任何预定义变量的信息,请参阅支持的协议和包装器。

通常调用

file_put_contents来本地存储数据。对于外部存储,还有其他安全存储数据的方法(您可能需要查看FTP客户端)。

检查通话的返回值。

  

此函数返回写入文件的字节数,如果失败则返回FALSE。

我的猜测是返回false

如果要在同一服务器上存储数据,请尝试文件系统路径(例如“/someting/a.file”)

另外,你链接的帖子清楚地说:

  

使用本地缓存文件,并在使用之前检查文件的存在和修改时间。例如,如果$ cache_file是本地缓存文件名[...]