Sans la mise en cache la page vous (ou au moins son GATE) vous ne pouvez pas vraiment faire usage de la 304. Un algorithme de mise en cache à part entière est un peu hors de portée, mais l'idée générale:
<?php
function getUrlEtag($url){
//some logic to get an etag, possibly stored in memcached/database/file etc.
}
function setUrlEtag($url,$etag){
//some logic to get an etag, possibly stored in memcached/database/file etc.
}
function getPageCache($url,$etag=''){
//[optional]some logic to get the page from cache instead, possibly not even using etag
}
function setPageCache($url,$content,$etag=''){
//[optional]some logic to save the page to cache, possibly not even using etag
}
ob_start();
$etag = getUrlEtag($_SERVER['REQUEST_URI']);
if(isset($_SERVER['HTTP_IF_NONE_MATCH']) && trim($_SERVER['HTTP_IF_NONE_MATCH']) == $etag) {
header("HTTP/1.1 304 Not Modified");
exit;
}
if(($content=getPageCache($_SERVER['REQUEST_URI'],$etag))!==false){
echo $content;
exit;
}
?>
//the actual page
<?php
$content = ob_get_clean();
setUrlEtag($_SERVER['REQUEST_URI'],$etag=md5($url.$content));
function setPageCache($_SERVER['REQUEST_URI'],$content,$etag);
header("Etag: $etag");
echo $content;
?>
Toutes les communes les pièges s'appliquent: vous ne pouvez pas afficher les pages de cache pour les utilisateurs connectés, une mise en cache du contenu partiel est plus souhaitable, vous êtes responsable de la prévention du contenu obsolète dans le cache (éventuellement en utilisant des triggers dans le backend ou la base de données autour avec la logique getUrlEtag
), etc. etc.
Vous co uld joue également avec HTTP_IF_MODIFIED_SINCE
si c'est plus facile à contrôler.
Cela me semble être l'idée générale. –
Bien que pour l'OP, il n'est pas nécessaire de mettre en cache quoi que ce soit. Selon ses conditions, il peut simplement calculer un Etag basé sur id. –
Ouais, la mise en œuvre réelle peut être aussi simple ou aussi élaborée que nécessaire dans la situation. J'ai essayé d'illustrer cela, et pourtant je suis tombé dans l'écueil de fournir une implémentation, md5() sur le contenu, ne devrait pas être là: P – Wrikken