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 の正しい表現を表示させるにはどうすればよいですか?