L'objectif de jCache serait de permettre de réaliser (sur le serveur) du cache de tout contenu quel qu'il soit, à partir du moment où il est sérialisable et donc stockable sous forme de chaine.
Cela serait utile pour (par exemple) :
- Mettre en cache le résultat d'un appel à un service externe (web service ou autre)
- Mettre en cache le résultat d'une requête SQL très lentes à s'exécuter
D'une façon générale, il s'agit donc de pouvoir mettre en cache n'importe quelle donnée, à partir du moment où le chargement de cette donnée est coûteuse en performance pour le site.
A plus long terme on peut imaginer que jZone soit revue pour exploiter jCache, on peut également envisager s'en servir pour du cache sur l'intégralité de la réponse (à voir en fonction de l'issu du ticket #4).
En terme d'implémentation, j'envisage :
- Que l'utilisation de jCache soit des plus simplistes, cad qu'on aurait une seule méthode statique get qui renverrait le contenu du cache et qui mettrait à jour le cache si nécessaire. Cette fonction recevrait en paramètre :
- Qqch permettant d'identifier le contenu caché, qui pourra être soit une string, soit un tableau de string. L'utilisation d'un tableau permettant de ranger le cache sous forme arborescente et donc d'en faciliter la gestion, la configuration et son vidage manuel. (par exemple on pourrait avoir comme identifiant de cache array(0=>'fr', 1=>'article', 2=>'hall-of-fame') auquel cas au niveau du stockage on aurait un répertoire /fr/article/hall-of-fame.
- Le nom de la fonction chargeant les données à cacher. Ce pourra être soit un simple nom de fonction, soit un tableau avec nom de classe + nom de méthode (pour les méthodes statiques) soit un tableau avec object + nom de méthode (pour les méthodes non statiques)
- Un tableau de paramètres à passer à la fonction/méthode chargeant les données à cacher
//Un appel à jCache ressemblerait donc à :
jCache::get(array('article', '1'), 'loadArticle', array(1));
//ou encore :
jCache::get('article1', array('myClassName', 'loadArticle'), array(1));
//ou encore :
jCache::get('article1', array(&$myObject, 'loadArticle'), array(1));
- Une configuration du cache entièrement déclarative via defaultConfig.ini.php où on aurait la possibilité
- De désactiver le cache de façon globale
- De préciser le TTL du cache de façon globale ou par type de contenu (compte tenu qu'on a une organisation arborescente des données cachée, l'idée et de potentiellement pouvoir définir une durée de cache différentes pour les différentes entrées de l'arborescence)
- De préciser le driver à utiliser (cf ci dessous) de façon globale ou par type de contenu (même principe que pour le TTL)
- Un système de lock et d'attente évitant que le cache soit raffraichit par plusieurs process simultanés
- Une méthode clear permettant de supprimer tout ou partie du cache.
- Un système de driver (file ou db) permettant dans le cas de db de partager une donnée en cache entre plusieurs frontaux load balancés.
Merci à tous ceux que ça intéressera de me donner leur feedback sur les objectifs et l'approche pour l'implémentation.