我在我的网站上显示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。:我不确定这可能只是一个"重复"题。但由于原始问题的答案对我不起作用,我不确定如何/在哪里提问。
答案 0 :(得分:0)
您的问题可能是外部网址。
根据file_put_contents documentation:
通常调用提示强>
如果已启用fopen
包装,则可以将URL用作具有此功能的文件名 有关如何指定文件名的详细信息,请参阅fopen()
有关各种包装器具有哪些功能的信息,使用说明以及它们可能提供的任何预定义变量的信息,请参阅支持的协议和包装器。
file_put_contents
来本地存储数据。对于外部存储,还有其他安全存储数据的方法(您可能需要查看FTP客户端)。
检查通话的返回值。
此函数返回写入文件的字节数,如果失败则返回FALSE。
我的猜测是返回false
。
如果要在同一服务器上存储数据,请尝试文件系统路径(例如“/someting/a.file”)
另外,你链接的帖子清楚地说:
使用本地缓存文件,并在使用之前检查文件的存在和修改时间。例如,如果$ cache_file是本地缓存文件名[...]