Valider 01416bbb rédigé par Fil's avatar Fil
Parcourir les fichiers

Mise en cache des resultats de la boucle (DATA)

* quand on passe une URL, mise en cache de 24h
* le format YQL met en cache pendant 1h
* les autres formats pour 10s (afin de ne pas charger n fois un meme fichier de donnees si on y fait plusieurs boucles)
* reglage possible par le critere {{{ {datacache n} }}}
parent 94a18ac9
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+79 −23
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -90,11 +90,56 @@ class IterateurDATA implements Iterator {
		return array('tableau');
	}

	protected function cache_get($cle) {
		# utiliser memoization si dispo
		include_spip('inc/memoization');
		if (!function_exists('cache_get')) return;
		return cache_get($cle);
	}

	protected function cache_set($cle, $ttl) {
		# utiliser memoization si dispo
		include_spip('inc/memoization');
		if (!function_exists('cache_set')) return;
		return cache_set($cle,
			array(
				'data' => $this->tableau,
				'time' => time(),
				'ttl' => $ttl
			),
			3600 + $ttl);
			# conserver le cache 1h deplus que la validite demandee,
			# pour le cas ou le serveur distant ne repond plus
	}

	protected function select($command) {
		// les commandes connues pour l'iterateur POUR
		// sont : tableau=#ARRAY ; cle=...; valeur=...
		// source URL
		if (isset($this->command['source'])) {
		if (isset($this->command['source'])
		AND isset($this->command['sourcemode'])) {

			# un peu crado : avant de charger le cache il faut charger
			# les class indispensables, sinon PHP ne saura pas gerer
			# l'objet en cache ; cf plugins/icalendar
			if (isset($this->command['sourcemode']))
				charger_fonction($this->command['sourcemode'] . '_to_array', 'inc', true);

			$cle = 'datasource_'.md5($this->command['sourcemode'].':'.$this->command['source']);
			# avons-nous un cache dispo ?
			$cache = $this->cache_get($cle);
			if (isset($this->command['datacache']))
				$ttl = intval($this->command['datacache']);
			if ($cache
			AND ($cache['time'] + (isset($ttl) ? $ttl : $cache['ttl']))
				> time()
			) {
				$this->tableau = $cache['data'];
			}
			else {
				# dommage que ca ne soit pas une option de yql_to_array...
				if ($this->command['sourcemode'] == 'yql')
					if (!isset($ttl)) $ttl = 3600;

				if (isset($this->command['sourcemode'])
				AND in_array($this->command['sourcemode'],
@@ -107,12 +152,16 @@ class IterateurDATA implements Iterator {
				else if (preg_match(',^https?://,', $this->command['source'])) {
					include_spip('inc/distant');
					$u = recuperer_page($this->command['source']);
			} else if (@is_readable($this->command['source']))
					if (!isset($ttl)) $ttl = 24*3600;
				} else if (@is_readable($this->command['source'])) {
					$u = spip_file_get_contents($this->command['source']);
			else
					if (!isset($ttl)) $ttl = 10;
				} else {
					$u = $this->command['source'];
					if (!isset($ttl)) $ttl = 10;
				}

			if (isset($this->command['sourcemode'])) {
				if ($u) {
					if ($g = charger_fonction($this->command['sourcemode'] . '_to_array', 'inc', true)) {
						if (is_array($a = $g($u))) {
							$this->tableau = $a;
@@ -121,6 +170,13 @@ class IterateurDATA implements Iterator {
							spip_log("erreur sur $g(): $u");
						}
					}

					if (!$this->err AND $ttl>0)
						$this->cache_set($cle, $ttl);
				}
				# en cas d'erreur http, utiliser le cache si encore dispo
				else if ($cache)
					$this->tableau = $cache['data'];
			}
		}

+9 −4
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -1390,6 +1390,12 @@ function critere_datasource($idb, &$boucles, $crit) {
	$command[\'sourcemode\'] = '.calculer_liste($crit->param[1], array(), $boucles, $boucles[$idb]->id_parent).';';
}

function critere_datacache($idb, &$boucles, $crit) {
	$boucle = &$boucles[$idb];
	$boucle->hash .= '
	$command[\'datacache\'] = '.calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent).';';
}


/*
 * Pour passer des arguments a un iterateur non-spip
@@ -1410,10 +1416,9 @@ function critere_args_dist($idb, &$boucles, $crit) {
 */
function critere_liste_dist($idb, &$boucles, $crit) {
	$boucle = &$boucles[$idb];
	$boucle->hash .= '$command[\'liste\'] = array();'."\n";
	$boucle->hash .= "\n\t".'$command[\'liste\'] = array();'."\n";
	foreach($crit->param as $param) {
		$boucle->hash .= '
			$command[\'liste\'][] = '.calculer_liste($param, array(), $boucles, $boucles[$idb]->id_parent).';';
		$boucle->hash .= "\t".'$command[\'liste\'][] = '.calculer_liste($param, array(), $boucles, $boucles[$idb]->id_parent).";\n";
	}
}

@@ -1430,7 +1435,7 @@ function critere_datapath_dist($idb, &$boucles, $crit) {
}


/* le critere {si ...} des boucles CONDITION */
/* le critere {si ...} applicable a toutes les boucles */
function critere_si_dist($idb, &$boucles, $crit) {
	$boucle = &$boucles[$idb];
	$boucle->hash .= '$command[\'si\'] = array();'."\n";