Reflexion sur un systeme de cache

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:
$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.

Réponses

  • StéphaneStéphane Member, Former PluXml Project Manager
    Bonjour

    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 du projet (2010 à 2018)

  • StéphaneStéphane Member, Former PluXml Project Manager
    memcached ce n'est pas une solution à installer coté serveur ? car si c'est le cas, ce n'est pas trop intéressant, car peu d'utilisateurs ont la main sur leur hébergement pour installer ce genre d'extension

    Consultant PluXml

    Ancien responsable du projet (2010 à 2018)

  • c'est effectivement la solution à installer coté serveur. C'est un daemon, et une extension php. Sinon, il y à l'extension php cache_lite, qui permet de faire sensiblement la meme chose, sans avoir de daemon à installer, juste l'extension.

    Je vais voir si je peux faire des benchmarks.
Connectez-vous ou Inscrivez-vous pour répondre.