Forum CMS Made Simple FR

Version complète : Modules et tâches pseudo-cron
Vous consultez actuellement la version basse qualité d’un document. Voir la version complète avec le bon formatage.
Bonjour,

Je suis en train de développer un module et j'aurai besoin de mettre en place des tâches automatiques suivant certains critères.
Je peux bien entendu utiliser « Cron » pour automatiser ces tâches mais certaines fonctionnalités resteraient alors fortement dépendantes de la configuration du serveur. Une migration ne tenant pas compte de ces tâches entrainerait une perte de fonctionnalités.

Pour résumer je compte utiliser le principe « pseudo cron » inclus dans CMSMS mais je n'ai actuellement pas eu le temps de me pencher sur ce sujet. Est-ce que l'un d'entre vous s'est déjà attardé sur ces fonctionnalités et pourrait m'en faire une très sommaire présentation ?
Fichiers à créer, comment définir la périodicité ?

Merci à vous.
J'utilise que le cron system, avec les défauts que tu viens de citer.

Cmsms possède son propre pseudo-cron, tu pourrais creuser de ce côté ? mais je n'ai malheureusement aucune documentation sous la main à ce sujet Sad
bess a écrit :Cmsms possède son propre pseudo-cron, tu pourrais creuser de ce côté ?

C'est exactement ce que je comptais faire, mais je souhaitais avoir des pistes d'utilisateurs ayant déjà expérimenté la chose.
Je pense que je vais devoir (encore une fois) parcourir les méandres du code de modules existants pour trouver la marche à suivre.

Quoiqu'il en soit, je tâcherai d'apporter ici même mes retours si d'ici là personne ne se manifeste :-)
Bon, j'ai réussi et ce n'est finalement pas si compliqué que cela.
Ce qui est regrettable c'est de ne pas avoir un belle documentation pour comprendre le principe et l'appliquer sur ses modules. Donc je m'en occupe ici.

[h]Mise en place d'une tâche pseudocron[/h]

Une fois votre module développé, vous souhaitez peut-être mettre en place des tâches automatisées pour différentes raisons : nettoyage de données, vérification régulière, etc.
La première méthode à laquelle on pense est l'usage de tâches Cron. Ces tâches sont liées au système et pas directement au site. Ainsi en cas de changement de serveur, il se peut que les tâches cron ne soient pas répliquées... et patatra.

CMSMS a la solution : les tâches pseudocron. Ces tâches ne sont pas nécessairement exécutées à la seconde prêt (contrairement aux tâches cron), mais de manière régulière en fonction de l'activité de votre site Internet (visites).

Comment mettre en place une tâche ?

Tout d'abord je vais appeler mon module dans ce tutoriel : Test.
Ainsi pour ajouter un pseudocron à votre module Test, vous devez faire ceci :

Dans le fichier Test.module.php, vous devez ajouter ceci :
Code :
[== PHP ==]
public function HasCapability($capability, $params = array())
{
   if( $capability == 'tasks' ) return TRUE;
   return FALSE;
}

public function get_tasks()
{
   return new TestMaTacheTask();
}
Ça va faire en sorte de dire à CMSMS que votre module supporte les tâches pseudocron et même lui dire qu'elle est cette ou ces tâches (ici une seule).

Ensuite vous devez créer une classe dans (site)/modules/Test/lib/ avec le nom de votre classe tel que défini ci dessus. Ici class.TestMaTacheTask.php.
Ce qui est très important c'est la présence à la fin de votre nom de fichier du mot-clé « Task ». C'est ce qui va permettre à CMSMS de lister les tâches simplement.

Dans ce fichier vous allez y mettre ceci :
Code :
[== PHP ==]
<?php
class TestMaTacheTask implements CmsRegularTask
{

   public function get_name()
   {
      return get_class();
   }

   public function get_description()
   {
      return 'Description de la tâche.';
   }

   public function test($time = '')
   {

      // Instantiation du module
      $test = cms_utils::get_module('Test');

      // Récupération de la dernière date d'exécution de la tâche
      if (!$time)
      {
         $time = time();
      }

      $last_execute = $test->GetPreference('MaVariableDeTestDeDerniereExecution');
      
      // Définition de la périodicité de la tâche (24h ici)
      if ( ($time - 24*60*60 ) >= $last_execute )
      {
         return TRUE;
      }
      
      return FALSE;
      
   }

   public function execute($time = '')
   {

      if (!$time)
      {
         $time = time();
      }

      $test = cms_utils::get_module('Test');
      
      // Ce qu'il y a à exécuter ici
      
      return true; // Ou false si ça plante

   }

   public function on_success($time = '')
   {

      if (!$time)
      {
         $time = time();
      }
      
      $test = cms_utils::get_module('Test');
      $test->SetPreference('MaVariableDeTestDeDerniereExecution', $time);
      $test->Audit('','Test','Ce que ça vient de faire');
      
   }

   public function on_failure($time = '')
   {
      $test->Audit('','Test','Ca a planté');
   }

}
?>

Cette classe comporte les fonctions suivantes :
- get_name : Retourne le nom de la tâche (ici c'est automatiquement le nom de la classe).
- get_description : Retourne la description de la tâche.
- test : On teste si la tâche doit être exécutée et si oui à quelle périodicité.
- execute : On exécute la tâche que l'on veut.
- on_success : Si la tâche s'est exécutée sans erreur.
- on_failure : Si la tâche a planté.

Vous aurez noté qu'il faut créer la « préférence » MaVariableDeTestDeDerniereExecution dans le module.install.php ou ailleurs afin que la tâche s'exécute convenablement.

Dans les Paramètres globaux » Paramètres avancés, on peut modifier un paramètre qui indique à quelle fréquence le système va tenter de gérer les tâches régulières. Bien entendu si vous voulez qu'une tâche s'exécute toutes les heures sur votre site et que vous avez un visiteur par jour ça ne devrait pas fonctionner. Les tâches ne s'exécutent que s'il y a de l'activité sur le site (visiteurs ou administrateurs).

Un petit vidage de cache (ça ne mange pas de pain) et tout devrait rouler.
C'est toujours un plaisir de te lire Smile
Merci pour ce beau tutoriel.