Je ne comprends pas trop le fonctionement du nouveau cron. Mais la supression du lock mysql est déja une belle évolution.
Le principe de base est de boucler sur la liste des taches, si la derniere éxecution de la tache est suffisement vieille, on effectue la tache, et on quitte la boucle des taches.
Si la tache du début de la liste a un temps de cycle trés court, elle squatte la première place, non? et les autres taches ne sont jamais effectué.
Autres détails. Plutot que de gérer 2 listes, une avec les temps, une avec les taches, pourquoi ne pas utiliser une classe.
class tache{
function delais(){
return 300;
}
function action(){
}
}
Toutes les taches se base sur ce schema, comme ça, quand on en rajoute ou enleve, il n'y a pas à vérifier la cohérence de 2 tableaux. Et puis avec ce système, l'ajout d'une tache peut se faire sans toucher au code de Spip. Spip lit le contenu du dossier "tache" par exemple et quand il voit toto.php, il l'include, et instancie la classe toto.
Mes 2 euros,
M.
Mon site (www.actionconsommation.org) fonctionne actuellement avec la
version 1.7.2
J'ai eu besoin d'exécuter des tâches de fond spécifiques à mon environnement
qui essentiellement vont examiner des boîtes de messages en IMAP pour
éliminer des virus et des spams, redifuser des messages ou déclencher de
nouveaux messages.
J'ai ajouté à la fin de inc-public-global
include('mes_robots.php3');
Le module mes_robots contient une fonction qui décide de l'exécution d'une
tâche représentée par un module spécifique en fonction de la date de
modification d'un fichier .txt du même nom que la tâche et du délai
souhaité.
function bloquer($nom,$delai,$jour='') {
if (($jour != '') && $jour != gmdate("w")) {
return false; }
if (@file_exists($nom) AND ((time() - @filemtime($nom)) < $delai)) {
return false; }
else { touch($nom,time());
return true; }
}
$nom est le nom du fichier représentatif de la tâche
$delai est le délai d'exécution en secondes
$jour est le jour de la semaine pour les tâches hebdomadaires
Pour chaque tâche à exécuter le code suivant est dans le fichier :
if (bloquer('tache.txt',$delai)) {
include('tache.php3'); }
Le fonctionnement de ce dispositif est tout à fait satisfaisant.
Maurice Frankel