JeuWeb - Crée ton jeu par navigateur
[Système multilingue] Mise en cache des pages traduites - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [Système multilingue] Mise en cache des pages traduites (/showthread.php?tid=2613)



[Système multilingue] Mise en cache des pages traduites - Sephi-Chan - 29-05-2008

Salut à tous,

Depuis la reprise active de Seelies — que l'on veut multilingue — je me demande comment gérer le cache des pages traduites, car j'ai du mal à imaginer une traduction à la volée à chaque chargement de page.

Le système utilise un tableau de localisation (généré à partir d'un objet JSON, pour faciliter la traduction par de tierces personnes) appelé $_localisation qu'une fonction utilise pour traduire les blocs de texte de chaque page. Ce tableau contient les traductions d'une langue unique pour chaque page du site.

Voici un exemple (bien qu'en pratique, je n'appelle pas ce tableau ainsi) :
Code PHP :
<?php 
echo $_localisation['login']['name']
Ce bloc pourrait être le label du nom à saisir sur la page de connexion, en français.

Ma question est donc : comment mettre en cache les pages générées ainsi. J'ai quelques pistes mais j'attends les vôtres pour faire mon choix. Smile


Sephi-Chan


RE: [Système multilingue] Mise en cache des pages traduites - Studio Gamboo - 29-05-2008

Salut Sephi,
Alors je commencerai d'abord par une petite remarque, ne vaux mieux t-il mettre en cache les clés traduite plutôt que des pages tout entières ?
Moi je procède de cette manière :
A chaque fois qu'une clé est demandé, j'ouvre mon fichier xml, je renvoi la clé traduite et je stocke le résultat dans la ram. Ainsi au bout de quelques pages, le xml n'est plus utilisé, toutes les requêtes vont directement puiser dans la ram de la machine (grand gain de vitesse).

Au niveau des solutions de cache, j'en connais 3 assez pratiques et simple :
- APC (http://fr.php.net/apc) : met en cache des variables dans la ram de la machine, pour l'instant en extension ça sera intégré directement dans php6. Ca fait également office de cache opcode. Rapide et trés simpe.
- Memcache (http://www.jeuweb.org/board/showthread.php?tid=3440) : met en cache également dans la ram, et permet de créer des "pools" de serveur pour de grande donnée. Rapide également ^^
- Les fichiers , bon la je te fait pas un dessin XD


RE: [Système multilingue] Mise en cache des pages traduites - Sephi-Chan - 29-05-2008

Salut Gamboo,

Mettre les clés en cache plutôt que les pages me convient tout aussi bien, ça me permet en plus de de ne pas avoir de soucis quand un joueur se connecte ou se déconnecte, car le contenu des pages n'est alors pas le même (j'utilise un menu commun à tout le site, le contenu des sous menu change ensuite, à la manière de Mac OS). Smile

Merci pour ces réponses, je m'étais intéressé à la mise en cache sur le serveur, et j'ai récemment relu ton article sur Memcache, que je vais essayer d'utiliser. APC et/ou Memcache sont-ils généralement installés sur les serveurs mutualisés ?

Pour tester cela en local, il va falloir que je me renseigne sur la façon d'installer les paquets PECL pour PHP sur Mac OS X… Je ne l'ai encore jamais fais.


Sephi-Chan


RE: [Système multilingue] Mise en cache des pages traduites - Studio Gamboo - 29-05-2008

Apc et Memcache ne sont je pense jamais installé sur des mutualisés.
Pour ce qui est de MAC OS X, je n'ai jamais réussi à y faire fonctionner memcache (cela nécessite un démon), par contre APC est compris dans MAMP, donc très facile à utiliser Smile


RE: [Système multilingue] Mise en cache des pages traduites - Sephi-Chan - 29-05-2008

Studio Gamboo a écrit :Apc et Memcache ne sont je pense jamais installé sur des mutualisés.
Pour ce qui est de MAC OS X, je n'ai jamais réussi à y faire fonctionner memcache (cela nécessite un démon), par contre APC est compris dans MAMP, donc très facile à utiliser Smile
Déjà et d'une, c'est toi le démon.

De deux, exact pour Mamp !
Citation :extension=apc.so

Merci, je reviens quand j'aurais testé tout ça, après mon cours de VB.net… :triste:


Sephi-Chan


RE: [Système multilingue] Mise en cache des pages traduites - Studio Gamboo - 29-05-2008

Tient je te colle pour info et brut de décoffrage ma classe de cache que j'utilise, elle permet d'utiliser soit apc, soit des fichiers pour l'instant donc voila.
Si t'a des remarques ou des corrections n'hésite(z) pas Smile

Code PHP :
<?php

class Cache
{
private static
$_instance;
public
$storage = "apc";
public
$ttl = "3600";

// --------------------------------------------------------------
public static function getInstance() {
// --------------------------------------------------------------
if(empty(self::$_instance))
{
self::$_instance = new Cache();
}
return
self::$_instance;
}

// --------------------------------------------------------------
public function setMedia($storage) { $this->storage = $storage; }
// --------------------------------------------------------------

// --------------------------------------------------------------
public function __set($key,$value) { return $this->set($key,$value); }
public static function
set($key,$value,$ttl="3600") {
// --------------------------------------------------------------
if(self::$_instance->storage=="file")
{
$file = fopen(Core::$_core->config['base_path']."public/cache/".md5($key),'w');
$value = serialize(array(time()+$ttl,$value));
return
fwrite($file,$value);
fclose($file);
}
return
apc_store($key,$value,$ttl);
}

// --------------------------------------------------------------
public function __get($key) { return $this->get($key); }
public static function
get($key) {
// --------------------------------------------------------------
if(self::$_instance->storage=="file")
{
$file = Core::$_core->config['base_path']."public/cache/".md5($key);
if(
file_exists($file) || is_readable($file))
{
$data = file_get_contents($file);
$data = unserialize($data);
if(
time()>$data[0]) { unlink($file); return false; }
else return
$data[1];
}
else return
false;
}
else return
apc_fetch($key);
}

// --------------------------------------------------------------
public function __isset($key) { return $this->is_set($key); }
public static function
is_set($key) {
// --------------------------------------------------------------
if(self::$_instance->storage=="file") { return self::$_instance->get($key); }
else
{
$value = apc_fetch($key);
if(!empty(
$value)) return $value;
else return
false;
}
}

// --------------------------------------------------------------
public function __unset($key) { return $this->un_set($key); }
public static function
un_set($key) {
// --------------------------------------------------------------
if(self::$_instance->storage=="file")
{
$file = Core::$_core->config['base_path']."public/cache/".md5($key);
if(
file_exists($file) || is_readable($file)) return unlink($file);
}
else return
apc_delete($key);
}

}

?>



RE: [Système multilingue] Mise en cache des pages traduites - Sephi-Chan - 29-05-2008

Merci pour la classe !

Quelques remarques :
  • Tu as fais un setter setMedia() qui affecte l'attribut $storage alors que celui-ci a une portée public, il faudrait qu'il soit privé pour justifier l'utilisation d'un setter. Wink
  • Dans les fonctions, des instructions suivent parfois le return, ils ne seront à priori jamais exécuté puisqu'à priori, la fonction est quitté sur ce mot clé.

En tout cas, merci beaucoup. Smile


Sephi-Chan


RE: [Système multilingue] Mise en cache des pages traduites - Ren Nelos - 30-05-2008

+1

J'ajouterais que ta méthode magique __set() ne différencie pas les variables public des variables private.
D'autant que je ne comprends pas pourquoi implémenter la méthode __set() et faire derrière un setMedia()...

Explique moi s'il te plait Smile

Cordialement,