Tâches planifiées sans cron

Ici, on va pas tergiverser sur ce qu'est un cron, les différents services webcron proposés, les hébergeurs qui le proposent ou pas...

Ici, je vous propose simplement un bout de code qui vous permettra d'effectuer des tâches simples et automatisées sur un hébergement ne proposant pas l'option cron.

Il n'y a rien de bien compliqué, mais cela peut donner des idées à certains, voir en aider d'autres.


Le principe est simple, il faut créer un marqueur à un temps donné, définir un intervalle de temps entre chaque requête automatisée et bien sur trouver un déclencheur. Le marqueur peut être créé de 2 façons, soit via un l'insertion d'une valeur dans une base de donnée, soit par l'écriture dans un fichier.

Vous avez votre propre base de données

Créez une table de ce type :

  1. CREATE TABLE IF NOT EXISTS `Cron_Data_Temp` (
  2. `Cron_Name` varchar(30) NOT NULL,
  3. `Cron_Data` int(11) unsigned NOT NULL default '0',
  4. PRIMARY KEY (`Cron_Name`)
  5. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Table de déclenchement des tâches planifiées';

Vous pouvez y insérer autant de tâche que vous le souhaitez. Le marqueur sera ici un timestamp.

La requête pour tester le marqueur sera du type :

  1. <?php
  2. $sql_cron = "
  3. SELECT Cron_Data
  4. FROM Cron_Data_Temp
  5. WHERE Cron_Name = 'CronTest'";
  6.  
  7. $res_cron = @mysqli_query($connect, $sql_cron);
  8.  
  9. $var_cron = @mysqli_fetch_array($res_cron);
  10. ?>

Le déclencheur, ici, sera la visite d'un internaute, autrement dit le chargement de la page sur laquelle sera insérer le script de test du marqueur.

On défini un lancement de la routine toute les heures (3600s). Dans la page TacheAuto.php se trouvera le routine à exécuter.

Dans la page d'accueil du site, par exemple, insérer donc la requête précédente et le test de condition suivant :

  1. <?php
  2. if (time() > ($var_cron['Cron_Data'] + 3600)) // On test si le marqueur à plus d'une heure
  3. {
  4. include ('./TacheAuto.php'); // On exécute notre routine
  5. }
  6. ?>

On met, ici, un include, mais on peu très bien imaginer un appel fopen ou tout autre type de fonction pour exécuter notre routine.

Pensez à y insérer la mise à jour du cron, ci dessous, pour définir l'intervalle de temps entre chaque déclenchement :

  1. <?php
  2. $upd_cron = "
  3. UPDATE Cron_Data_Temp SET
  4. Cron_Data = '".time()."'
  5. WHERE Cron_Name = 'CronTest'";
  6.  
  7. @mysqli_query($connect, $upd_cron);
  8. ?>

Vous n 'avez pas de base de données

Enfin, pour ceux qui ont un hébergement sans base de données, on peut remplacer la table Cron_Data_Temp qui contient notre marqueur temps par un simple fichier txt dans lequel on insérera la valeur choisie.

Dans ce cas là, dans notre page d'accueil, on insère ce type de code :

  1. <?php
  2. if(file_exists("Cron_Data_Temp.txt")) // Si le fichier existe
  3. {
  4. $file = fopen('Cron_Data_Temp.txt', 'r'); // On ouvre le fichier en lecture
  5. $var_cron = fgets($file); // on lit la ligne 1
  6. fclose($file); // On ferme le fichier
  7. }
  8. else // Si le fichier n'existe pas
  9. {
  10. $var_cron = 0; //On défini la valeur 0 pour le time du cron
  11. }
  12.  
  13. if (time() > ($var_cron + 3600))
  14. {
  15. include ('./TacheAuto.php'); // On exécute notre routine
  16. }
  17. ?>

Comme pour l'update de la table, on modifie la valeur enregistrée dans le fichier :

  1. <?php
  2. $file = fopen('Cron_Data_Temp.txt', "w"); // On ouvre le fichier en écriture en le vidant ou on le créé s'il n'existe pas
  3. fputs($file , time()); // On ajoute l'heure de l’exécution du script
  4. ?>

Attention, le fait de déclencher la routine via l'arrivée peut être risqué en cas de départ de celui-ci. En effet, si le visiteur déclenche la routine, mais qu'il quitte le site avant la fin de son exécution, celle-ci s'arrêtera.

Pour éviter ce désagrément et continuer son exécution, il est important d'insérer en haut de votre script le code suivant :

  1. <?php
  2. ignore_user_abort(true);
  3. set_time_limit(0);
  4. ?>

Et voilà. Vous pouvez maintenant faire autant de tâches planifiées et automatisées que vous le souhaitez.

Gardez tout de même à l'esprit que plus vous en ferez et plus elle seront lourde, plus elles utiliseront de ressources serveur. N'hésitez donc pas pour les gros travaux à passer par une solution externe ou à upgrader votre hébergement.

Vos avis

N'oubliez pas de noter l'article. ;-)

Message
Expéditeur et validation
Bonjour,

En effet, cette petite astuce est bien pratique.
Je l'utilise pour contrôler les liens brisés, impeccable.
Bonjour,

J'utilisais déjà une astuce similaire mais votre article m'aura permis de découvrir l'instruction ignore_user_abort().