1

tonic.php (http://peej.github.com/tonic/) ライブラリを使用して REST リソースを作成します。データは非常に安定しており、キャッシュ時間が長い方が望ましいでしょう。キャッシュ ヘッダーを設定します (tonic.php ライブラリを使用):

$lastModified = gmdate('D, d M Y H:i:s', $_SERVER['REQUEST_TIME']) . ' GMT';                    
$expires = gmdate('D, d M Y H:i:s', ($_SERVER['REQUEST_TIME'] + $httpCacheDuration)) . ' GMT'; 
$response->addHeader('Cache-Control', 'public,max-age='.$httpCacheDuration.',must-revalidate');                    
$response->addHeader('Expires', $expires);
$response->addHeader('Last-Modified', $lastModified); 

問題は、html が要求されると、php ページに対して cURL 呼び出しが行われ、返された html が応答本文に入れられることです。

$ch = curl_init();  
curl_setopt($ch, CURLOPT_URL, $url . '?identifier=' . $identifier);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$html = curl_exec($ch); 
curl_close($ch);

$response->body = $html;

この返されたページは、同じリソースへの AJAX 呼び出しによって実際のデータを取得しますが、「text/html」ではなく「application/json」のヘッダーを受け入れます。AJAX呼び出しはjqueryで行われ、設定した場合

cache: true

jquery $.ajax で、accept: text/html を使用してリソースを呼び出すと、データが Web ページ (Firefox) ではなく JSON として表示されるか、エラー (IE8) がスローされます。コード:

switch ($format) {

    case 'html':

        $response->addHeader('Content-type', 'text/html');
        $lastModified = gmdate('D, d M Y H:i:s', $_SERVER['REQUEST_TIME']) . ' GMT';                    
        $expires = gmdate('D, d M Y H:i:s', ($_SERVER['REQUEST_TIME'] + $httpCacheDuration)) . ' GMT';                                                      
        $response->addHeader('Cache-Control', 'public,max-age='.$httpCacheDuration.',must-revalidate');                    
        $response->addHeader('Expires', $expires);
        $response->addHeader('Last-Modified', $lastModified);  
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_COOKIE, $strCookie);
        curl_setopt($ch, CURLOPT_URL, url . '?identifier=' . $identifier);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

        $html = curl_exec($ch);         
        curl_close($ch);
        $response->body = $html;
        return $response;
        break;

    case 'json':

        $result = DataManager::get($identifier);
        if (empty($result)) {
            $response->code = Response::NOTFOUND;
            return $response;
        }

        $lastModified = gmdate('D, d M Y H:i:s', $_SERVER['REQUEST_TIME']) . ' GMT';                    
        $expires = gmdate('D, d M Y H:i:s', ($_SERVER['REQUEST_TIME'] + $httpCacheDuration)) . ' GMT';                                                      
        $response->addHeader('Cache-Control', 'public,max-age='.$httpCacheDuration.',must-revalidate');                    
        $response->addHeader('Expires', $expires);
        $response->addHeader('Last-Modified', $lastModified);
        $response->addHeader('Content-type', 'application/json');
        $response->code = Response::OK;
        $response->body = json_encode($result);
        return $response;
        break;

    // we don't have a suitable format, so do a 406 response instead
    default:
        $response->code = Response::NOTACCEPTABLE;
        $response->addHeader('Content-type', 'text/plain');
        $response->body = getErrorPage(Response::NOTACCEPTABLE);
        return $response;
        break;
}

追加する

$response->addHeader('Vary', 'Accept');

それを機能させます。ただし、json はキャッシュされないため、Jquery ajax 呼び出しで cache: false を設定した場合と同じ動作になります。

2 つの異なる表現をキャッシュし、ブラウザに要求された Accept-Header の正しい表現を表示させるにはどうすればよいですか?

4

1 に答える 1