Valider 738a96f3 rédigé par cedric@yterium.com's avatar cedric@yterium.com
Parcourir les fichiers

mise au propre du verrou sur la syndication :

la fonction syndic_a_jour doit toujours etre appelee par la gestion de travaux en attente, et elle ne prend plus qu'un argument, id_syndic, pour assurer l'unicité de son appel pour chaque site : 
il faut inserer l'appel a cette fonction via job_queue_add avec no_duplicate=true

C'est syndic_a_jour qui determine le statut dans lequel on doit passer le site en cas d'echec de la syndication,
et on ajoute a son entree un controle que la fonction appelante est bien 'queue_start_job' via debug_backtrace
parent c55c9752
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+28 −23
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -49,10 +49,34 @@ function action_editer_site_dist($arg=null) {
		redirige_url_ecrire();
	}

	if ($resyndiquer OR _request('reload'))
		syndic_resyndic($id_syndic,_request('reload'));

	if (_request('redirect')) {
		$redirect = parametre_url(urldecode(_request('redirect')),'id_syndic', $id_syndic, '&');
		include_spip('inc/headers');
		redirige_par_entete($redirect);
	}
	else 
		return array($id_syndic,'');
}

/**
 * Re-syndiquer un site,
 * en forcant eventuellement aussi le rechargement de ses infos
 *
 * @param int $id_syndic
 * @param bool $reload
 *   recharger les infos de description depuis le site en ligne
 * @param bool $purge
 *   purger les articles syndiques si on arrete la syndication
 * @return void
 */
function syndic_resyndic($id_syndic, $reload=false, $purge=true){
	// Re-syndiquer le site
	if (_request('reload') == 'oui') {
	if ($reload) {
		// Effacer les messages si on supprime la syndication
		if (_request('syndication') == 'non')
		if ($purge AND _request('syndication') == 'non')
			sql_delete("spip_syndic_articles", "id_syndic=".intval($id_syndic));

		$t = sql_getfetsel('descriptif', 'spip_syndic', "id_syndic=$id_syndic AND syndication IN ('oui', 'sus', 'off')", '','', 1);
@@ -83,25 +107,6 @@ function action_editer_site_dist($arg=null) {
		$syndiquer_site = charger_fonction('syndiquer_site','action');
		$syndiquer_site($id_syndic);
	}

	if (_request('redirect')) {
		$redirect = parametre_url(urldecode(_request('redirect')),'id_syndic', $id_syndic, '&');
		include_spip('inc/headers');
		redirige_par_entete($redirect);
	}
	else 
		return array($id_syndic,'');
}

// Cette fonction redefinit la tache standard de syndication
// pour la forcer a syndiquer le site dans la globale genie_syndic_now

// http://doc.spip.org/@genie_syndic
function genie_syndic($t) {
	include_spip('genie/syndic');
	define('_GENIE_SYNDIC', 2); // Pas de faux message d'erreur
	$t = syndic_a_jour(_GENIE_SYNDIC_NOW);
	return $t ? 0 : _GENIE_SYNDIC_NOW;
}

// http://doc.spip.org/@insert_syndic
+11 −9
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -15,20 +15,22 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
// http://doc.spip.org/@action_editer_site_dist
function action_syndiquer_site_dist($id_syndic=null) {

	if (is_null($arg)){
	if (is_null($id_syndic)){
		$securiser_action = charger_fonction('securiser_action', 'inc');
		$id_syndic = $securiser_action();
	}

	if ($id_syndic=intval($id_syndic)) {
	  // ah si PHP connaisait les fermetures...
	  // A la place, une constante utilisee exclusivement
	  // dans la fct suivante.
		define('_GENIE_SYNDIC_NOW', $id_syndic);
		// forcer l'execution immediate de cette tache
		// (i.e. appeler la fct suivante avec gestion du verrou)
		cron(0, array('syndic' => -91));

	$id_job = job_queue_add('syndic_a_jour','syndic_a_jour',array($id_syndic),'genie/syndic',true);
	// l'executer immediatement si possible
	if ($id_job) {
		include_spip('inc/queue');
		queue_schedule(array($id_job));
	}
	else {
		spip_log("Erreur insertion syndic_a_jour($id_syndic) dans la file des travaux",_LOG_ERREUR);
	}

}

?>
 No newline at end of file
+44 −28
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -13,9 +13,16 @@
if (!defined("_ECRIRE_INC_VERSION")) return;
include_spip('inc/syndic');

## valeurs modifiables dans mes_options
## attention il est tres mal vu de prendre une periode < 20 minutes
if (!defined('_PERIODE_SYNDICATION'))
	define('_PERIODE_SYNDICATION', 2*60);
if (!defined('_PERIODE_SYNDICATION_SUSPENDUE'))
	define('_PERIODE_SYNDICATION_SUSPENDUE', 24*60);


// http://doc.spip.org/@genie_syndic_dist
function genie_syndic_dist($t) {
	define('_GENIE_SYNDIC', 1); // pour message de compatibilite ci-dessous
	return executer_une_syndication();
}

@@ -27,19 +34,15 @@ function genie_syndic_dist($t) {
// http://doc.spip.org/@executer_une_syndication
function executer_une_syndication() {

	## valeurs modifiables dans mes_options
	## attention il est tres mal vu de prendre une periode < 20 minutes
	define('_PERIODE_SYNDICATION', 2*60);
	define('_PERIODE_SYNDICATION_SUSPENDUE', 24*60);

	// On va tenter un site 'sus' ou 'off' de plus de 24h, et le passer en 'off'
	// s'il echoue
	$where = sql_in("syndication", array('sus','off')) . "
	AND NOT(" . sql_date_proche('date_syndic', (0 - _PERIODE_SYNDICATION_SUSPENDUE) , "MINUTE") . ')';
	$id_syndic = sql_getfetsel("id_syndic", "spip_syndic", $where, '', "date_syndic", "1");
	if ($id_syndic) {
		$res1 = syndic_a_jour($id_syndic, 'off');
	} else $res1 = true;
		// inserer la tache dans la file, avec controle d'unicite
		job_queue_add('syndic_a_jour','syndic_a_jour',array($id_syndic),'genie/syndic',true);
	}

	// Et un site 'oui' de plus de 2 heures, qui passe en 'sus' s'il echoue
	$where = "syndication='oui'
@@ -47,28 +50,32 @@ function executer_une_syndication() {
	$id_syndic = sql_getfetsel("id_syndic", "spip_syndic", $where, '', "date_syndic", "1");

	if ($id_syndic) {
		$res2 = syndic_a_jour($id_syndic, 'sus');
	} else $res2 = true;

	return ($res1 OR $res2) ? 0 : $id_syndic;
		// inserer la tache dans la file, avec controle d'unicite
		job_queue_add('syndic_a_jour','syndic_a_jour',array($id_syndic),'genie/syndic',true);
	}

	return 0;
}

//
// Mettre a jour le site
//
// Attention, cette fonction ne doit pas etre appellee simultanement
// sur un meme site: un verrouillage a du etre pose en amont.
//

// http://doc.spip.org/@syndic_a_jour
function syndic_a_jour($now_id_syndic, $statut = 'off') {
/**
 * Mettre a jour le site
 * Attention, cette fonction ne doit pas etre appellee simultanement
 * sur un meme site: un verrouillage a du etre pose en amont.
 * => elle doit toujours etre appelee par job_queue_add
 *
 * http://doc.spip.org/@syndic_a_jour
 *
 * @param int $now_id_syndic
 * @return bool|string
 */
function syndic_a_jour($now_id_syndic) {
	include_spip('inc/texte');
	if (!defined('_GENIE_SYNDIC'))
		spip_log("syndic_a_jour doit etre appelee par Cron. Cf. " .
			 "http://trac.rezo.net/trac/spip/changeset/10294",
			 'vieilles_defs');
	$row = sql_fetsel("*", "spip_syndic", "id_syndic=$now_id_syndic");
	$call = debug_backtrace();
	if ($call[1]['function']!=='queue_start_job')
		spip_log("syndic_a_jour doit etre appelee par JobQueue Cf. http://trac.rezo.net/trac/spip/changeset/10294",_LOG_ERREUR);

	$row = sql_fetsel("*", "spip_syndic", "id_syndic=".intval($now_id_syndic));

	if (!$row) return;

@@ -80,7 +87,16 @@ function syndic_a_jour($now_id_syndic, $statut = 'off') {
	else
		$moderation = 'publie';	// en ligne sans validation

	sql_updateq('spip_syndic', array('syndication'=>$statut, 'date_syndic'=>date('Y-m-d H:i:s')), "id_syndic=$now_id_syndic");
	// determiner le statut a poser en cas d'echec : sus par defaut
	// off si le site est deja off, ou sus depuis trop longtemps
	$statut = 'sus';
	if (
		$row['statut']=='off'
	  OR ($row['statut']=='sus' AND time()-strtotime($row['date_syndic'])>_PERIODE_SYNDICATION_SUSPENDUE*60)
	  )
		$statut = 'off';

	sql_updateq('spip_syndic', array('syndication'=>$statut, 'date_syndic'=>date('Y-m-d H:i:s')), "id_syndic=".intval($now_id_syndic));

	// Aller chercher les donnees du RSS et les analyser
	include_spip('inc/distant');
@@ -109,12 +125,12 @@ function syndic_a_jour($now_id_syndic, $statut = 'off') {
	// suppression apres 2 mois des liens qui sont sortis du feed
		if ($row['oubli'] == 'oui') {

		  sql_delete('spip_syndic_articles', "id_syndic=$now_id_syndic AND NOT(" . sqL_date_proche('maj', -2, 'MONTH') . ') AND NOT(' . sql_date_proche('date', -2, 'MONTH') . ") AND $faits");
		  sql_delete('spip_syndic_articles', "id_syndic=$now_id_syndic AND NOT(" . sql_date_proche('maj', -2, 'MONTH') . ') AND NOT(' . sql_date_proche('date', -2, 'MONTH') . ") AND $faits");
		}
	}

	// Noter que la syndication est OK
	sql_updateq("spip_syndic", array("syndication" => 'oui'), "id_syndic=$now_id_syndic");
	sql_updateq("spip_syndic", array("syndication" => 'oui'), "id_syndic=".intval($now_id_syndic));

	return false; # c'est bon
}
+1 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -2,7 +2,7 @@
	<nom>Sites</nom>
	<icon>prive/themes/spip/images/site-24.png</icon>
	<auteur>Collectif SPIP</auteur>
	<version>1.3.1</version>
	<version>1.3.2</version>
	<version_base>1.0.0</version_base>
	<etat>test</etat>
	<description>Sites et syndication dans SPIP (priv&eacute; et public)</description>