2014-02-16 63 views
1

在WordPress主題中,我顯示來自外部JSON API的信息。如何緩存這些數據以改善頁面加載時間。如何緩存外部json請求?

我有一個jQuery函數

var url = 'http://my.api.com/' 
$.getJSON(url) 
    .done(function(data) { 
    #display this data 
    }) 
    .fail(function(jqXHR, textStatus, error) { 
    #handle errors 
    }); 

jQuery的是否提供了一種方法來緩存這些請求?或者我應該以某種方式在WordPress中處理這個問題(也許將響應寫入服務器上的JSON文件)?

+0

你看過這篇文章 - http://stackoverflow.com/questions/17379312/cache-json-response? – verisimilitude

+0

感謝真實,我曾經見過類似的東西,但這仍然是一個有用的帖子。由於我的API響應對於所有用戶都是相同的(即沒有變量被傳遞),我想知道服務器端緩存是否會是更好的選擇?你怎麼看? –

+0

如果所有用戶的響應相似,那麼服務器端緩存絕對是更好的選擇。 – verisimilitude

回答

4

根據API和調用的上下文,可以使用服務器完成這些API調用,而不是要求客戶端執行此操作。做前者意味着你可以通過數據庫使用緩存,但這意味着服務器會更加緊張,因爲它是現在完成所有請求的一個。

如果它不是用戶特定的信息,這可能只是真的值得。也就是說,我是服務器端緩存任何涉及外部Web服務的主要支持者。

你可能會想利用一些的WordPress的內置功能,具體包括:

WP_Http 這是WordPress的漂亮內置的HTTP庫,你可以用交談的API 。

Transients API再次 - 超級漂亮。允許您在本地數據庫中存儲和檢索自我到期數據。

的快速實現(未經測試,請讓我知道,如果有問題)如下:

define('HOURS', 60 * 60); 

function get_api_info() { 

    global $apiInfo; // Check if it's in the runtime cache (saves database calls) 
    if(empty($apiInfo)) $apiInfo = get_transient('api_info'); // Check database (saves expensive HTTP requests) 
    if(!empty($apiInfo)) return $apiInfo; 

    $response = wp_remote_get('http://my.api.com'); 
    $data = wp_remote_retrieve_body($response); 

    if(empty($data)) return false; 

    $apiInfo = json_decode($data); // Load data into runtime cache 
    set_transient('api_info', $apiInfo, 12 * HOURS); // Store in database for up to 12 hours 

    return $apiInfo; 
} 

然後,你只需要調用get_api_info()在你的代碼的任何地方來獲取你需要的數據。如果您在同一個請求/腳本中多次調用該函數,它仍然只會向數據庫大聲一次。如果您在12小時內在多個請求中調用該函數,則它只會發送一次API請求。

談效率!

當然,我也建議有一個類的實現,所以你可以使用實例變量而不是全局數據來存儲數據,但這只是nitpicky。

希望有幫助!

+0

感謝adomnom,這正是我正在尋找的。你知道以這種方式可以存儲在數據庫字段中的最大大小是多少?我已經實現了上面的代碼,通過檢查數據庫,我可以看到api響應正在寫入正確的選項鍵,但是我無法在頁面上顯示它?我試過'echo get_api_info'。我究竟做錯了什麼? –

+0

忽略我之前對顯示錯誤的評論。我的一個愚蠢的錯誤。這是完美的,謝謝! –

+0

任何信息的最大字段大小仍然讚賞。 –