2017-07-02 72 views
0

我在我的網站上顯示Highcharts,它可視化外部API的數據。我不希望每個網頁瀏覽都調用這個API,而是希望將檢索到的數據本地存儲在緩存文件中。下一個訪問該頁面的用戶應該從該本地緩存文件中獲取Highcharts數據,而不是從API URL中獲取(爲了減少API調用和Highcharts加載時間)。緩存文件應該被認爲是最新的60分鐘。在本地文件中緩存外部JSON API - 不起作用

我在這裏找到了答案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); 
.... 

WhenI載入我的網站,在該Highcharts的顯示結果,但顯然僅由API URL。我的cache.json文件保持空白。我給它chmod 777,所以我爲父目錄做了數據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

這個'https:// www.example.com/data/dataCache/cache.json'看起來不像本地文件。 – RiggsFolly

回答

0

您的問題可能是外部網址。

由於每file_put_contents documentation

提示
的URL可如果fopen包裝已啓用作爲具有這種功能的文件名。
有關如何指定文件名的更多詳細信息,請參閱fopen()
請參閱支持的協議和包裝以獲取有關各種包裝具有哪些功能的信息的鏈接,關於它們的用法的註釋以及它們可能提供的任何預定義變量的信息。

file_put_contents通常被調用來在本地存儲數據。對於外部存儲,還有其他安全存儲數據的方式(您可能希望查看FTP客戶端)。

檢查您的呼叫的返回值。

該函數返回寫入文件的字節數,或返回失敗時的FALSE。

我的猜測是返回false

如果你想將數據存儲在同一臺服務器上,嘗試一個文件系統路徑(如「/someting/a.file」)

而且,那個帖子你鏈接到明確表示:

使用本地緩存文件,並在使用之前檢查文件的存在和修改時間。例如,如果$ cache_file是一個本地緩存文件名[...]

+0

感謝您的快速響應。但我不確定是否我們誤解了對方:我確實想在本地存儲數據。因此我在本地創建了一個空的cache.json文件。如果我運行上面的代碼,外部URL被成功調用,但cache.json文件保持空白。但我的代碼應該檢索API數據**並將其存儲在cache.json中。但是第二部分不是因爲某些原因而發生的。請注意,我以「example.com」爲例。考慮一下我的領域。 – bauhausweb

+1

如果'$ cache_file =「https://www.example.com/data/dataCache/cache.json」;',那不是本地文件路徑(即使_if_指向服務器上的本地文件)。如果它以「http」開頭,它不是本地的。嘗試使用'/ tmp/cache.json'這樣的東西來測試它。如果是這樣的話,那麼你需要將'$ cache_file'更新爲'/ var/www/project/data/dataCache/cache.json'類似的東西 –

+0

另外,使用絕對路徑(看到你的帖子更新並想澄清這個)。絕對路徑以'/'開頭(或者如果你在窗口中則是「C:」)。所以請確保你的相對路徑「path/to/my/cache.json」是正確的,或者使用絕對路徑如「/path/to/my/cache.json」 –