Reflexion sur un systeme de cache
rockyhorror
Member
Bonjour à tous,
J'ai commencer à regarder pour un systeme de cache pour pluxml. Je me suis tourné vers le daemon memcached, et sa classe php associée, php5-memcached.
L'idée, dans un premier temps, est de limiter les accès disque, en vérifiant avant chaque ouverture de fichier, que son contenu
n'est pas déjà en cache.
Bon evidemment, en l'état cela demande quelque modifs au niveau de plxMotor, et de plxAdmin. Autrement il faudrait disposer d'un hook
qui soit appelé avant chaque accès à un fichier (articles, commentaires, catégories ...)
Pour tester j'ai écrit une classe plxMemcached, et bricolé le code de plxMotor et plxAdmin. Cela donnerait quelque chose comme ça
par exemple dans plxMotor pour mettre en cache:
Faire les include nécessaire
Ajouter dans le constructeur de la classe:
Avant:
Faire les include nécessaire,
Puis par exemple pour la fonction editArticle:
Avant:
Voila quelques pistes, reste à voir comment cela pourrait s'intégrer proprement dans pluxml, voir s'il serait possible d'ajouter une option "activer memcached" par exemple.
Le fichier de la classe est disponible ici
Dite moi ce que vous en pensez et comment on peut faire évoluer ça.
Je l'ai pour ma part mis en pratique sur mon site, et ça fonctionne plutot bien.
J'ai commencer à regarder pour un systeme de cache pour pluxml. Je me suis tourné vers le daemon memcached, et sa classe php associée, php5-memcached.
L'idée, dans un premier temps, est de limiter les accès disque, en vérifiant avant chaque ouverture de fichier, que son contenu
n'est pas déjà en cache.
Bon evidemment, en l'état cela demande quelque modifs au niveau de plxMotor, et de plxAdmin. Autrement il faudrait disposer d'un hook
qui soit appelé avant chaque accès à un fichier (articles, commentaires, catégories ...)
Pour tester j'ai écrit une classe plxMemcached, et bricolé le code de plxMotor et plxAdmin. Cela donnerait quelque chose comme ça
par exemple dans plxMotor pour mettre en cache:
Faire les include nécessaire
Ajouter dans le constructeur de la classe:
$this->plxMemcached = new plxMemcached();
Puis par exemple pour la fonction parseArticle:Avant:
public function parseArticle($filename) {
# Mise en place du parseur XML
$data = implode('',file($filename));
$parser = xml_parser_create(PLX_CHARSET);
xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0);
....
}
Après:
public function parseArticle($filename) {
# Mise en place du parseur XML
$key = $this->plxMemcached->setKey(basename($filename), $this->aConf['clef']);
$data = $this->plxMemcached->get($key);
if(!$data){
$data = implode('',file($filename));
$this->plxMemcached->set($key, $data);
}
$parser = xml_parser_create(PLX_CHARSET);
xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0);
....
}
Dans la partie plxAdmin, pour effacer le cache lors de la modification du fichier (edititon d'un article par exemple):Faire les include nécessaire,
Puis par exemple pour la fonction editArticle:
Avant:
public function editArticle($content, &$id) {
......
# On genère le nom de notre fichier
$time = $content['year'].$content['month'].$content['day'].substr(str_replace(':','',$content['time']),0,4);
if(!preg_match('/^[0-9]{12}$/',$time)) $time = @date('YmdHi'); # Check de la date au cas ou...
if(empty($content['catId'])) $content['catId']=array('000'); # Catégorie non classée
$filename = PLX_ROOT.$this->aConf['racine_articles'].$id.'.'.implode(',', $content['catId']).'.'.trim($content['author']).'.'.$time.'.'.$content['url'].'.xml';
# On va mettre à jour notre fichier
if(plxUtils::write($xml,$filename)) {
# suppression ancien fichier si nécessaire
.....
}
Après:
public function editArticle($content, &$id) {
......
# On genère le nom de notre fichier
$time = $content['year'].$content['month'].$content['day'].substr(str_replace(':','',$content['time']),0,4);
if(!preg_match('/^[0-9]{12}$/',$time)) $time = @date('YmdHi'); # Check de la date au cas ou...
if(empty($content['catId'])) $content['catId']=array('000'); # Catégorie non classée
$filename = PLX_ROOT.$this->aConf['racine_articles'].$id.'.'.implode(',', $content['catId']).'.'.trim($content['author']).'.'.$time.'.'.$content['url'].'.xml';
# on efface le cache memcached
$key = $this->plxMemcached->setKey(basename($filename), $this->aConf['clef']);
$this->plxMemcached->del($key);
# On va mettre à jour notre fichier
if(plxUtils::write($xml,$filename)) {
# suppression ancien fichier si nécessaire
.....
}
La Méthode "setKey", permet d'obtenir une clé qui soit unique à chaque blog (dans le cas de plusieurs pluxml qui accède à un meme daemon memcached), et qui ne soit pas "devinable" facielement (sécurité minimume). Mais elle n'est pas obligatoire, on peut appeler les méthodes "get", "set", "delete" directement avec le nom du fichier.Voila quelques pistes, reste à voir comment cela pourrait s'intégrer proprement dans pluxml, voir s'il serait possible d'ajouter une option "activer memcached" par exemple.
Le fichier de la classe est disponible ici
Dite moi ce que vous en pensez et comment on peut faire évoluer ça.
Je l'ai pour ma part mis en pratique sur mon site, et ça fonctionne plutot bien.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Ce qui serait intéressant c'est d'avoir un benchmark pour mesurer les gains sur 100, 500, 1000 articles (idem avec les commentaires)
Apres effectivement il faudrait peut être des hooks supplémentaires.
Sinon l'idée du cache est intéressante en effet.
Consultant PluXml
Ancien responsable et développeur de PluXml (2010 à 2018)
Consultant PluXml
Ancien responsable et développeur de PluXml (2010 à 2018)
Je vais voir si je peux faire des benchmarks.