WordPress:Cache
Un article de Wiki.
[modifier] Principe de fonctionnement du cache
Dans WordPress, certaines valeurs sont accédées très fréquemment, comme les options ou les catégories. Il est alors très coûteux d'accéder à la base MySQL à chaque fois pour lire la valeur. Créer un cache applicatif permet de garder, en mémoire applicative, la valeur lue de MySQL, pour y accéder rapidement lors d'une nouvelle demande.
Comme optimisation supplémentaire, on sait que certaines valeurs seront très probablement utilisées, lors de l'éxécution du code PHP. Pour ne pas accéder de multiples fois à la base de données et copier les valeurs, une par une, dans le cache; on optimise alors en lisant un groupe de valeurs, en une seule requête MySQL, au début de l'exécution. Ce groupe de valeur sera alors disponible dans le cache, comme un groupe de variables globales.
Evidemment, il faut gérer le cas où une de ces valeurs est modifiée pour garder synchronisés le cache et la base de données. Cela rajoute de la complexité au programme.
Pour le moment, nous n'avons parlé que d'une exécution.
Un autre niveau d'optimisation est de gérer un cache persistent, c'est à dire une mémoire qui reste disponible même après une exécution. On voit bien l'intérêt, dans le cas d'un site très fréquenté: par exemple, 100 personnes vont accéder à la même page, en moins d'une minute. En copiant les valeurs dans un fichier 'plat', on conserve les valeurs au delà d'une exécution. Le fichier plat sera ensuite utilisé par les exécutions suivantes, ce qui est plus rapide que de passer par la base de données.
Mais il n'est pas très clair si le cache persistent est actif dans toutes les configurations de WordPress?
De plus, le fichier persistent n'est utile qu'à partir de la 2ème exécution. Le premier utilisateur demandant la page devra créer le fichier pour les autres! Il aura donc un temps de réponse médiocre car il accédera à la base de données pour copier les valeurs en cache et puis créera généreusement le fichier cache persistent pour les utilisateurs suivants.
[modifier] Analyse du code
Dans WP2.0.5, il y a dans le répertoire 'wp-includes', le fichier 'cache.php'. Dedans on trouve la définition de la classe WP_Object_Cache, qui sera instancié avec la variable globale $wp_object_cache, ainsi que les fonctions qui permettent d'utiliser le cache sans connaitre cet objet.
Il n'y a malheureusement que très peu de commentaires dans le code. On ne sait pas de quand date ce code et s'il est à 100% actif.
Quand on regarde le constructeur, le nombre de conditions à remplir semble plutôt indiquer un code en cours de développement. il faut que ENABLE_CACHE soit défini. il faut que DISABLE_CACHE ne soit pas défini. Pour utiliser le cache persistent, il ne faut pas que php soit en safe_mode. Enfin, il faut que le répertoire pour écrire le fichier cache persistent soit en accès de lecture/écriture.
function WP_Object_Cache() {
global $blog_id;
if (defined('DISABLE_CACHE')) return;
if ( ! defined('ENABLE_CACHE') ) return;
// Disable the persistent cache if safe_mode is on.
if ( ini_get('safe_mode') && ! defined('ENABLE_CACHE') ) return;
if (defined('CACHE_PATH')) $this->cache_dir = CACHE_PATH;
else
// Using the correct separator eliminates some cache flush errors on Windows
$this->cache_dir = ABSPATH.'wp-content'.DIRECTORY_SEPARATOR.'cache'.DIRECTORY_SEPARATOR;
if (is_writable($this->cache_dir) && is_dir($this->cache_dir)) {
$this->cache_enabled = true;
} else {
if (is_writable(ABSPATH.'wp-content')) {
$this->cache_enabled = true;
}
}
if (defined('CACHE_EXPIRATION_TIME'))
$this->expiration_time = CACHE_EXPIRATION_TIME;
if ( defined('WP_SECRET') )
$this->secret = WP_SECRET;
else
$this->secret = DB_PASSWORD . DB_USER . DB_NAME . DB_HOST . ABSPATH;
$this->blog_id = $this->hash($blog_id);
}

