Cachelab : duree-minuit

Bonjour,

Je teste cachelab.

Avec

#CACHE{12*3600, filtre-tartempion }

function cachelab_filtre_tartempion() {

// faire quelquechose
error_log("faire quelquechose : ", 0);

}


Pas de soucis, le filtre est bien appelé.

Avec 

#CACHE{12*3600, duree-minuit #MAINTENANT}


function cachelab_duree_minuit($maintenant) {
$secondesDemainMinuit = strtotime('tomorrow') - time();
error_log("Minuit : " . $secondesDemainMinuit, 0);
error_log("Type : " . gettype($secondesDemainMinuit), 0);
return = $secondesDemainMinuit;
}

Celui-ci n'est pas executé : pas de log.

Je manque sans doute quelque chose ?

https://contrib.spip.net/CacheLab-etend-la-balise-CACHE

Cordialement,

Eric

J'ai lu la remarque,

pour l'appel dans le squelette ...

C'est #CACHE(3600, duree minuit)

Pour la fonction, c'est :

function cachelab_duree_minuit($valeur_environnement) {
// faire quelquechose
return $valeur_environnement_modifiee}

ET, memoization est nécessaire.

C'est bien cela, memoization est indispensable pour utilisée une
fonction cachelab_duree_methode ?

Cordialement,

Eric

https://contrib.spip.net/CacheLab-etend-la-balise-CACHE

Le 13/12/2018 à 17:35, eric a écrit :

J'ai lu la remarque, pour l'appel dans le squelette ...
C'est #CACHE(3600, duree minuit)

Pour la fonction, c'est :
function cachelab_duree_minuit($valeur_environnement) {
// faire quelquechose
return $valeur_environnement_modifiee}

Pas tout à fait.
La durée dynamique des caches n'est pas un filtre comme les autres
car son usage est simplifié :
- il ne reçoit pas le cache en paramètre avec son contenu et ses métadonnées,
mais la valeur de l'un des champs de l'environnement reçu par le squelette.
Lors de l'appel, il faut que tu spécifie le nom de cette variable :
#CACHE{3600, duree tonfiltre lavariable}
C'est date_creation par défaut
- car il renvoie simplement la durée souhaitée par le cache
(et ne modifie pas la valeur d'environnement).

ET, memoization est nécessaire.
C'est bien cela, memoization est indispensable pour utilisée une
fonction cachelab_duree_methode ?

C'est ce qui est indiqué oui.

Ceci dit, comme indiqué dans la doc, il y a plein d'autre caches
qui peuvent intervenir pour prolonger la durée constatée :
reverse cache, proxies, cache navigateurs.
Le bon usage de la durée dynamique d'un cache suppose
que les mises à jour de tous ces caches soient bien maîtrisées...

PS : Merci d'avoir posé ta question sur les listes et pas en privé :slight_smile:
Ceci dit, la liste spip-user est plus réservée à l'usage du noyau de SPIP
et des plugin-dists. Il y a une liste de discussion pour les plugins :
c'est la liste spip-zone.
Surtout que ce plugin est encore à l'état de tests et développement.

JLuc

Je poursuis sur spip-zone
Le jeudi 13 décembre 2018 à 20:23 +0100, JLuc a écrit :

Le 13/12/2018 à 17:35, eric a écrit :
>
> J'ai lu la remarque, pour l'appel dans le squelette ...
> C'est #CACHE(3600, duree minuit)
>
> Pour la fonction, c'est :
> function cachelab_duree_minuit($valeur_environnement) {
> // faire quelquechose
> return $valeur_environnement_modifiee}
Pas tout à fait.
La durée dynamique des caches n'est pas un filtre comme les autres
car son usage est simplifié :
- il ne reçoit pas le cache en paramètre avec son contenu et ses
métadonnées,
mais la valeur de l'un des champs de l'environnement reçu par le
squelette.
Lors de l'appel, il faut que tu spécifie le nom de cette variable :
#CACHE{3600, duree tonfiltre lavariable}
C'est date_creation par défaut
- car il renvoie simplement la durée souhaitée par le cache
(et ne modifie pas la valeur d'environnement).

>
> ET, memoization est nécessaire.
> C'est bien cela, memoization est indispensable pour utilisée une
> fonction cachelab_duree_methode ?
C'est ce qui est indiqué oui.

Ceci dit, comme indiqué dans la doc, il y a plein d'autre caches
qui peuvent intervenir pour prolonger la durée constatée :
reverse cache, proxies, cache navigateurs.
Le bon usage de la durée dynamique d'un cache suppose
que les mises à jour de tous ces caches soient bien maîtrisées...

PS : Merci d'avoir posé ta question sur les listes et pas en privé :-
)
Ceci dit, la liste spip-user est plus réservée à l'usage du noyau de
SPIP
et des plugin-dists. Il y a une liste de discussion pour les plugins
:
c'est la liste spip-zone.
Surtout que ce plugin est encore à l'état de tests et développement.

JLuc

function cachelab_duree_progapprox($date_creation) {
	$dt_creation = new DateTime($date_creation);
	if (!$dt_creation)
		return _DUREE_CACHE_DEFAUT;

	$interval = $dt_creation->diff(new DateTime('NOW'),true); //
valeur absolue
	if (!$interval)
		return _DUREE_CACHE_DEFAUT;
	if ($interval->y > 2)
		return 6*30*24*3600; // 6 mois si plus de 2 ans
	if ($interval->y)
		return 30*24*3600;	// 1 mois si plus d'un an
	if ($interval->m)
		return 7*24*3600;	// 1 semaine si plus d'un mois
	if ($interval->d > 7)
		return 24*3600;		// 1 jour si plus d'une
semaine
	if ($interval->d)
		return 6*3600;		// 6h si plus d'un jour
	if ($interval->h > 6)
		return 3600;		// 1h si plus de 6h
	if ($interval->h)
		return 30*60;		// 1/2h si plus d'1h
	if ($interval->i > 10)
		return 10*60;		// 10 minutes si plus de
10 minutes
	if ($interval->i)
		return 60;			// chaque minute si
plus d'une minute
	return 10;				// 10secondes si
moins d'une minute
}

J'essaie de comprendre :

cachelab_duree_progapprox($date_creation)

$date_creation est bien la date de création du cache ?

Et la valeur retournée, si $date_creation existe (qu'un cache a déjà
été calculé ?), une durée de cache ?

Lorsque cette durée de cache est atteinte - ou dépassée ? - un recalcul
sera effectué ?

Merci,

Eric

C'est bon :

L'environnement :

(
[id_rubrique] => 144
[id_article] => 1598
[date] => 2018-12-14 16:11:52
[date_default] => 1
[date_redac] => 2018-12-14 16:11:52
[date_redac_default] => 1
)

Dans le squelette :

#CACHE{12*3600, duree minuit date}

date étant la date de dernier calcul du squelette.

je retourne une durée de cache calculée jusqu'au lendemain minuit en
secondes + 1 minutes (60s de marge).

Le squelette sera recalculée le lendemain à minuit.

Les entêtes de la réponse :

x-spip-cache: 27705
x-spip-methode-duree-cache: minuit date

function cachelab_duree_minuit($date)
{   error_reporting(E_ALL);
    $dt_creation = new DateTime($date);
    if (!$dt_creation)
        return (12 * 3600);
    $secondesDemainMinuit = strtotime('tomorrow') - time();
    //error_log("Minuit : " . $secondesDemainMinuit, 0);
    //error_log("Type : " . gettype($secondesDemainMinuit), 0);
    return $secondesDemainMinuit;
}

squelettes/mes_fonctions_cachelab.php :

/**
* Établit une durée de cache jusqu'au
* lendemain minuit avec une marge.
*
* @param $date
* @return false|int
*/
function cachelab_duree_minuit($date)
{
if (!$date) {
error_log("Recalcul squelette cachelab pour : " .
_DUREE_CACHE_DEFAUT . " - Pas de date");
return _DUREE_CACHE_DEFAUT;
}
$margeApresMinuit = 300; // 5 minutes
$secondesDemainMinuit = (strtotime('tomorrow') - time());
$secondesDemainMinuitMargee = $secondesDemainMinuit +
$margeApresMinuit;
error_log("Recalcul squelette cachelab pour : " .
$secondesDemainMinuitMargee . "secondes", 0);
return $secondesDemainMinuitMargee;
}

Ok.
Ça donne à peu près ce que tu veux ?
JL

Le 14/12/2018 à 17:20, eric a écrit :

squelettes/mes_fonctions_cachelab.php :

/**
* Établit une durée de cache jusqu'au
* lendemain minuit avec une marge.
*
* @param $date
* @return false|int
*/
function cachelab_duree_minuit($date)
{
if (!$date) {
error_log("Recalcul squelette cachelab pour : " .
_DUREE_CACHE_DEFAUT . " - Pas de date");
return _DUREE_CACHE_DEFAUT;
}
$margeApresMinuit = 300; // 5 minutes
$secondesDemainMinuit = (strtotime('tomorrow') - time());
$secondesDemainMinuitMargee = $secondesDemainMinuit +
$margeApresMinuit;
error_log("Recalcul squelette cachelab pour : " .
$secondesDemainMinuitMargee . "secondes", 0);
return $secondesDemainMinuitMargee;
}

Bonjour,

Ça donne à peu près ce que tu veux ?

Tout à fait, les articles concernés sont bien recalculés lors d'une
visite après minuit et 5 minutes.

Auparavant, j'utilisais #CACHE(12*3600) pour avoir au moins une mise à
jour chaque jour en cas de visite.

Maintenant ce sera un seul calcul toutes les 24 heures si une visite a
lieu.

Merci,

Eric

Le 15/12/2018 à 16:15, eric a écrit :

Bonjour,

Ça donne à peu près ce que tu veux ?

Tout à fait, les articles concernés sont bien recalculés lors d'une
visite après minuit et 5 minutes.

Ok.
Aprés l'avoir simplifié et rebaptisé jusqueminuit,
je l'ai ajouté en exemple à la doc.

Maintenant ce sera un seul calcul toutes les 24 heures si une visite a
lieu.

Si tu n'utilises pas l'API de cachelab pour cibler les invalidations,
il y a de fortes chances que le cache soit invalidé plusieurs fois dans la journée,
et chacune de ces invalidations provoquera le recalcul de cette noisette.

Mais au moins ça garantit que ça sera rafraîchit au premier affichage après minuit 5.

JL

Aprés l'avoir simplifié et rebaptisé jusqueminuit,
je l'ai ajouté en exemple à la doc.

Merci.

Si tu n'utilises pas l'API de cachelab pour cibler les invalidations,
il y a de fortes chances que le cache soit invalidé plusieurs fois
dans la journée,

Pour l'instant, j'ai bloqué l'invalidation du cache sur la publication
d'un message de forum.
C'est donc pour le moment le seul événement qui invalidera tout le
cache.

Par contre, je ne sais pas si les calcul successifs, le 24 à minuit, le
25 à minuit, crée à chaque fois un nouveau jeu de fichiers dans le
cache ou si les anciens sont effacés. Je scrute(rai).

Pour ma question postée sur la liste Spip à propos de la date de
modification, je me suis basé sur le filtre |date_iso pour obtenir un
horaire de modification fixe conforme à schema.org/Date .

/**
 * Retourne une date formatée avec heure fixe au format "ISO 8601" avec
TimeOffset.
 * La date #DATE est conservée, seul l'horaire peut-être modifié.
 * @example `[(#DATE|date_iso_8601_heure_fixe{0,5,0})]` peut donner
"2018-12-15T00:05:00+01:00"
 * Si heures, minutes, secondes ne sont pas indiquées : ces valeurs ne
sont pas modifiées.
 * @example `[(#DATE|date_iso_8601_heure_fixe)]` peut donner "2018-12-
15T18:05:13+01:00"
 * Conforme avec https://schema.org/Date
 *
 * @filtre
 *
 * @link https://schema.org/Date
 * @link https://en.wikipedia.org/wiki/ISO_8601
 *
 * @uses recup_date()
 *
 * @param string $date_heure
 *     Une écriture de date
 * @param array $options {
 * @type int $heure_fixe
 *         Permet de fixer l'heure
 * @type int $minute_fixe
 *         Permet de fixer les minutes
 * @type int $seconde_fixe
 *         Permet de fixer les secondes
 * }
 *
 * @return string
 *     La date formatée
 **/
function date_iso_8601_heure_fixe($date_heure, $options) {
    list($annee, $mois, $jour) = recup_date($date_heure);
    if ($options) {
        list($heures, $minutes, $secondes) = $options;
    } else {
        list($heures, $minutes, $secondes) = recup_date($date_heure);
    }
    $time = @mktime($heures, $minutes, $secondes, $mois, $jour,
$annee);
    return(date(DATE_ATOM, $time));
}

J'ai ajouté ce filtre à mes_fonctions_cachelab.php

Cordialement,

Eric

Filtre précédent corrigé :

/**
* Retourne une date formatée avec heure fixe au format "ISO 8601" avec
TimeOffset.
* La date #DATE est conservée, seul l'horaire peut-être modifié.
* @example
`[(#DATE|date_iso_8601_heure_fixe{#ARRAY{heures,0,minutes,5,secondes,0}
})]` donne "2018-12-15T00:05:00+01:00"
* Si heures, minutes, secondes ne sont pas indiquées : ces valeurs ne
sont pas modifiées.
* @example `[(#DATE|date_iso_8601_heure_fixe)]` peut donner "2018-12-
15T18:05:13+01:00"
* Conforme avec https://schema.org/Date
*
* @filtre
*
* @link https://schema.org/Date
* @link https://en.wikipedia.org/wiki/ISO_8601
*
* @uses recup_date()
*
* @param string $date_heure
* Une écriture de date
* @param array $options {
* @type int $heure_fixe
* Permet de fixer l'heure
* @type int $minute_fixe
* Permet de fixer les minutes
* @type int $seconde_fixe
* Permet de fixer les secondes
* }
*
* @return string
* La date formatée
**/
function date_iso_8601_heure_fixe($date_heure, $options = array()) {

list\($annee, $mois, $jour\) = recup\_date\($date\_heure\);

if \($options\) \{
    //PHP7\.1
    list\('heures'=>$heures,'minutes'=>$minutes,

'secondes'=>$secondes) = $options;
} else {
list($heures, $minutes, $secondes) = recup_heure($date_heure);
}

$time = @mktime\($heures, $minutes, $secondes, $mois, $jour,

$annee);

return\(date\(DATE\_ATOM, $time\)\);

}