Carnet Wiki

spip_cron_ajoute

Version 2 — Mai 2014 JLuc

Ajouter des jobs

Ce code fonctionne pour SPIP2, mais je crois qu’il est bon aussi pour SPIP3 car job_queue n’a pas beaucoup bougé. Sinon signalez le ici !

Rq : C’est collé serré au plus près du PHP, ce qui permet de l’utiliser même dans des programmes qui n’incluent pas le noyau de SPIP, et à qui on fait bénéficier de la bibliothèque SPIP. Et donc du coup du coup ça utilise mysql_query. Si on en normalisait l’écriture, il faudrait utiliser mysql_insert ou mysql_insertq à la place du mysql_query, mais du coup ça ne serait plus utilisable en dehors du code SPIP.

//
// Procure un moyen de lancer des actions SPIP via la table spip_jobs, bénéficiant ainsi de ses librairies
//
// $inclure sert à définir quel fichier inclure avant l'appel ultérieur, si nécessaire
// - soit on charge un fichier de définition de la fonction appelée seulement, et alors la fonction est surchargeable,
// pour charger_fonction il faut un / à la fin
// charge mesquelettes/admin/genie puis appelle admin_genie_jobtest_dist
// spip_cron_ajoute ("jobtest", "spip_cron_ajoute queue jobtest avec inclure de admin/genie/", array ("hello", "new_world"), "admin/genie/"); 
// - soit on charge un fichier de définition de plein de fonctions, et c'est tout le fichier qui est surchargeable
// ça fait un include_spip du fichier du même nom, le .php est ajouté avant l'inclusion
// spip_cron_ajoute ("jobtest", "spip_cron_ajoute queue jobtest dans admin/genie par cron", array ("hello", "new_world"), "admin/genie"); 
//


function spip_cron_ajoute ($function, $description, $arguments, $delai, $inclure = "protected/jobs") 
{
	$arguments = addslashes(serialize($arguments));


static $when;
	if (!isset($when))
		$when = 0; 
	// En cas d'appels successifs, 
	// si ya jamais de délai, $when reste à 0. 
	// Si ya un délai à un moment, when s'ancre dans le temps à partir de là
	if ($delai // délai en secondes entre jobs consécutifs
		and !$when)
			$when = time();
	
	// cf plugins/auto/job_queue/inc function queue_add_job et queue_start_job
	// 'inclure' vaut '' ou un fichier inclu avant l'appel par include_spip OU par charger_fonction si inclure se termine par '/'
	$q = "INSERT INTO spip_jobs
			SET fonction = '$function',
			descriptif = '".addslashes($description)."',
			args = '$arguments',
			md5args = '".md5($arguments)."',
			inclure = '$inclure',
			priorite = 0,
			date = '". date('Y-m-d H:i:s',$when)."',
			status = 1" // programmé, sinon en attente
	;
	$r = mysql_query ($q);
	if (!$r)
             spip_log ("Oups pb spip_cron_ajoute avec $q ".mysql_error(), "cron_ajoute");
	
	$when += $delai;
}

Exemples d’utilisation avec spip_lettres

// avec plugin spip-lettres
	spip_cron_ajoute ('lettres_envoyer_une_lettre_email', "1er Envoi lettre 33 à popol",
		array(33, 'popol@domaine.org'), 60, "inc/delivrer_hors_abo");


// ou, avec des champs à remplacer dans la lettre :
	spip_cron_ajoute (
		'lettres_envoyer_une_lettre_email', 
		"Envoi lettre 33 à $emaildest",
		array(33, $emaildest, array ('prenom'=>'Popaul', 'commande'=>'tel produit boutique')), 
		60, 
		"inc/delivrer_hors_abo");