Cache et lifetime

Bonjour,

Je cherche à faire des optimisations sur un plugin en utilisant le cache qui a l’air de faire ce que je souhaite à savoir mémoriser des choses durant un certain temps. Je précise que je n’ai pas encore testé en détail mais me pose des questions après avoir regardé le code.

La classe cache a une fonction set($_key, $_value, $_lifetime = 0, $_options = null) qui m’intéresse beaucoup. $_lifetime est en quelle unité ?
Cette même classe a une fonction hasExpired() qui ne prend pas de paramètres et qui retourne toujours true :

	public function hasExpired(): bool {
		return true;
	}

Je suis quelque peu décontenancé… Cette fonction est un placeholder et n’a jamais été écrite ?
D’après ce que j’ai vu la fonction set fait un save qui fait un setDateTime. La fonction hasExpired() devrait donc comparer la date et l’heure actuelle avec la date obtenue avec getDateTime + le lifetime (ou en utilisant la fonction php strtotime("+${lifetimme}unité_du_lifetime")).

J’ai vérifié : utils::setJsonAttr qui est utilisée pour lire une valeur en cache ne vérifie pas DateTime non plus.

Soit je ne sais pas quelque chose concernant le cache qui a été défini il y a longtemps, soit j’ai loupé un truc, soit la fonction hasExpired doit être modifiée. J’ai déjà recherché sur le community mais n’ai rien trouvé.

Merci pour vos lumières.

A+
Michel

edit: le lifetime est géré par le moteur de cache \Doctrine\Common\Cache.… ?
Suite à la lecture de ces lignes (vendor/doctrine/cache/lib/Doctrine/Common/Cache/Cache.php) :

    /**
     * Puts data into the cache.
     *
     * If a cache entry with the given id already exists, its data will be replaced.
     *
     * @param string $id       The cache id.
     * @param mixed  $data     The cache entry/data.
     * @param int    $lifeTime The lifetime in number of seconds for this cache entry.
     *                         If zero (the default), the entry never expires (although it may be deleted from the cache
     *                         to make place for other entries).
     *
     * @return bool TRUE if the entry was successfully stored in the cache, FALSE otherwise.
     */
    public function save($id, $data, $lifeTime = 0);

j’ai essayé de faire un sve avec un lifetime en secondes (9 minutes et 50 secondes). Et bien après le temps (10 minutes), le cache retourne la valeur stockée.

Salut,

Alors en stable c’est la lib que tu as vu mais c’est en cours de réécriture si je ne m’abuse et en beta c’est plus le cas.
Donc faut savoir quelle branche tu regardes :blush:

1 « J'aime »

Bonjour
Le Lifetime est en seconde. La fonction hasexpire était là pour rétro compatibilité et ne doit pas être utilisée. Le cache étant supprimé au bout du lifetime cette fonction ne peut de toute façon pas marcher.

A noter que si le cache existe pas tu as bien un objet mais le getValue renvoi null

Merci à vous deux pour vos réponses.

Je suis en stable V4.4.9 et j’ai fait un petit essai : un bout de code dans le preSave de l’eqLogic pour maitriser le lancement :

    ///// TEST cache //////////////////////////////////////////////////////
    $v = self::getFromCache('testCache');
    log::add(__CLASS__, 'debug', __CLASS__ . '::' . __FUNCTION__ . ': ' . sprintf("******************** getFromCache 1 = '%s'", $v));
    self::saveToCache('testCache', self::now(), 10); // <-- lifetime = 10secondes
    $v = self::getFromCache('testCache');
    log::add(__CLASS__, 'debug', __CLASS__ . '::' . __FUNCTION__ . ': ' . sprintf("******************** getFromCache 2 = '%s'", $v));
    ///// TEST cache //////////////////////////////////////////////////////

Sachant que j’utilise le cache du plugin dans ce cas :

  static function getFromCache($_key = '', $_default = '') {
    $plugin = plugin::byId(__CLASS__);
    return $plugin->getCache($_key, $_default);
  }

  static function saveToCache($_key, $_value = null, $_lifetime = 0) {
    $plugin = plugin::byId(__CLASS__);
    $plugin->setCache($_key, $_value, $_lifetime);
  }

Dans un autre cas, j’utilise le cache de l’instance eqLogic. Comme les 2 fonctionnent de la même manière, le test est valable pour le cache, au final.

Le résultat est sans appel :

2768|[2024-08-01 10:50:45] DEBUG  : klereo::preSave: ******************** getFromCache 1 = '2024-08-01 10:46:03'
2769|[2024-08-01 10:50:45] DEBUG  : klereo::preSave: ******************** getFromCache 2 = '2024-08-01 10:50:45'

→ le cache n’est pas vidé en fonction du lifetime, même plusieurs minutes après expiration du lifetime.

C’est lié à la version ? Ce sera corrigé en V4.4.10 ?

edit: curieusement, après plus de 10 minutes le cache est effectivement vide :

2837|[2024-08-01 11:03:12] DEBUG  : klereo::preSave: ******************** getFromCache 1 = ''
2838|[2024-08-01 11:03:12] DEBUG  : klereo::preSave: ******************** getFromCache 2 = '2024-08-01 11:03:12'

C’est possible que le cache actuel bug la lib est pas de nous donc je sais pas te dire si c’est normal ou non.

En 4.4.10 y’aura un nouveau système de cache mais en bêta qui lui est fait maison et n’aura pas ce bug.

Après la 4.4.10 il sera en stable

La V4.4.10 sera bientôt dispo ?
Le traitement du cache est effectué dans une tâche cron à la minute ?

La 4.4.10 est en alpha le reste je peux pas te dire c’est soumis à la validation de jeedom donc j’ai pas la main dessus.

Pour la gestion je te laisse lire le code mais non c’est pas que du cron (il y a aussi) mais aussi du temps réel quand tu le demande.

1 « J'aime »

Salut Loïc,

Tu peux me confirmer que le lifetime est bien pris en compte et correctement géré en 4.4.10 stable ?
Je ferai des essais quand même, mais c’est juste pour savoir si ça vaut le coup de s’y pencher.

Merci :slight_smile:

A+
Michel

Bonjour
Normalement oui sur les modes de cache en bêta oui pas de soucis sur l’historique j’ai pas testé mais je pense que oui.

1 « J'aime »