Exécuter un script PHP à intervalle régulier

 

Qui n'a jamais eu envie de ne pas travailler et de laisser quelqu'un faire le boulot pour soit ? Bonne nouvelle ! C'est possible ! Nous appelons ce héros des temps modernes les tâches Cron !

Bon d'accord j'ai menti, elles ne vous permettront pas de vous reposer sur vos lauriers en attendant qu'arrive l'heure du repas mais concernant l'informatique, vous aller pouvoir faire de grandes choses :

  • Sauvegarder vos bases de données automatiquement
  • Envoyer des rappels à vos clients pour des factures impayées
  • Générer vos statistiques et vous envoyer le tout en PDF par mail
  • Nettoyer votre forum tous les jours à 1h15 du matin
  • Et tellement d'autres choses...
  • etc.

De manière générale, vous allez être en mesure de programmer des tâches répétées sur votre hébergement avec des scripts et ce qui va nous intéresser tout particulièrement : les scripts PHP !

Cela donne envie n'est-ce pas ? Et bien nous allons découvrir dans ce tutoriel ce petit tour de magie ! Vous verrez, rien de bien compliqué mais il fallait y penser !

"Bip Bip !" (Notification de réception du mail automatique du démarrage d'une tâche Cron)

Oh! il est temps de commencer !


Suivez le guide !

Tâche Cron


Votre CPanel recèle des outils très puissants et celui qui va nous intéresser aujourd'hui est : L'outil de tâche CRON !

Si vous vous connectez à votre CPanel, vous devriez trouver ceci tout en bas dans le panneau « Avancé » :

Tâche Cron CPanel

Cliquez-dessus pour ouvrir la fenêtre :

Vous arriverez sur l'interface principale de Cron.

Tâche Cron CPanel

Vous pouvez y trouver plusieurs informations importantes :

  • Tout d'abord avec le premier volet en haut, vous pouvez configurer l'adresse email que vous voulez utiliser pour recevoir les notifications de démarrage des tâches Cron

  • Au centre, vous trouverez le module pour ajouter une nouvelle tâche Cron

  • Tout en bas vous trouverez toutes vos tâches déjà programmées avec leurs détails. Vous pourrez aussi les modifier et le supprimer

Tout peut se faire depuis cette interface. Nous allons commencer par construire notre tâche Cron puis nous l'ajouterons à notre programme.


Suivez le guide ! Planification d'une tâche Cron

Une tâche Cron est composée principalement de 2 parties :

  • La date/fréquence d'exécution // le script (Php ou non) à exécuter

Voici un petit exemple de tâche Cron :

  1. # Chaque vendredi à 18 heure
  2. 0 18 * * 5 /etc/www/le_weekend_est_arrive.php

Vous pouvez constater qu'elle est constituée de 6 champs séparés par des espaces dont les 5 premiers champs servent à définir les dates d'exécution du programme.

Nous allons voir en détail comment celle-ci sont formatées :

  1. Minutes Heure Jour Mois Jour-Semaine chemin/dossier/script_a_executer

Voici le détail des champs dans l'ordre :

  1. Les minutes où le programme sera exécuté (valeurs possibles de 0 à 59)

  2. Les heures où le programme sera exécuté (valeurs possibles de 0 à 23).

  3. Les jours du mois où le programme sera exécuté (valeurs possibles de 1 à 31)

  4. Les mois où le programme sera exécuté (valeurs possibles de 1 à 12).

  5. Les jours de la semaine où le programme sera exécuté (valeurs possibles de 0 à 6 - 0 est le Dimanche et 6 le Samedi)

  6. Enfin on trouve le script à exécuter


De plus, il existe 3 caractères spéciaux :

  • « * » qui joue le rôle de joker et prend toutes les valeurs possibles

  1. # Chaque minute qui s'écoule
  2. * * * * * php-cli -f /home/utilisateur/public_html/un_scrit_execute_chaque_minute.php

Il est aussi possible de donner une valeur implicite comme par exemple :

  1. # Toute les 5 minutes pendant 1 heure toute les 12 heures toute l'année
  2. */5 */12 * * * php-cli -f /home/utilisateur/public_html/un_autre_script.php

Le « /x » signifie « tous les x jour/heure/minute... ».


Le second caractère spécial est le trait d'union :

  • « - » qui permet de donner une plage de valeur

  1. # Tous les jour de la semaine exepté le weekend de 8h à 18h
  2. 0 8-18 * * 1-5 php-cli -f /home/utilisateur/public_html/je_suis_au_travail.php


Enfin, le dernier caractère spécial est la virgule

  • « , » elle permet de coller plusieurs valeurs ou plages de valeurs ensemble :

  1. # Chaque jour de semaine à 7h30 exepté en juillet et août
  2.   30 7 * 1,2,3,4,5,6,9,10,11,12 1-5 php-cli -f /home/utilisateur/public_html/on_se_leve_en_attendant_les_vacances.php

 

Pour exécuter une tâche, il vous suffit de préciser les horaires d'exécution du script avec les valeurs correspondantes. Vous pouvez vous aider des sélecteurs à côté de chaque champ qui sont très largement détaillés :

Tâche Cron CPanel

Sélectionnez simplement les valeurs de votre choix. Sinon, utilisez les différents caractères vus au-dessus pour construire votre programme.

 

Suivez le guide ! Lancer un script PHP avec Cron

Maintenant que notre plage horaire est définie, nous allons devoir indiquer dans le champ de commande l'adresse de notre script Php.

Par défaut, la commande est une commande UNIX (nous travaillons sous CloudLinux, c'est donc un système Unix). Elle n'est donc pas consciente que l'on lui demande d'exécuter un script Php.

Nous allons donc devoir lui passer deux choses avant notre script pour lui indiquer qu'il s'agit d'un script Php et qu'il faut l'interpréter comme tel :

  • L'adresse de Php dans notre système
  • le paramètre « -f » qui permet d'indiquer que nous utilisons un fichier
  • Puis seulement après le chemin de notre script Php.

Il existe plusieurs chemins possibles pour Php, vous pouvez utiliser :

Enfin, vous allez devoir indiquer le chemin depuis la racine de votre script Php.

Celui-ci ressemble à : « /home/nom_utilisateur/public_html/un_fichier_a_la_racine_du_site.php ».

Vous devrez remplacer « nom_utilisateur » par le pseudo que vous utilisez pour vous connecter à votre CPanel.


Voici un exemple de commande complet :

  1. php-cli -f /home/utilisateur/public_html/execution_periodique.php

Et avec la première méthode :

  1. /usr/local/bin/php -f /home/utilisateur/public_html/execution_periodique.php


Une fois rentré dans la ligne de commande, vous n'avez plus qu'à valider le tout pour ajouter votre planification.

Voici un exemple complet :

Tâche Cron CPanel

Validez et votre tâche sera ajoutée et visible dans le tableau de planification :

Tâche Cron CPanel


Il nous reste un problème de taille : le spam de Cron

A chaque fois que le serveur va lancer une nouvelle tâche Cron, il va nous envoyer un mail. C'est pratique si vous ne lancez un script qu'une fois toutes les semaines ou tous les jours mais si vous en lancez plusieurs toutes les heures, cela vient très rapidement remplir votre boite mail.

Pour éviter cela, vous pouvez indiquer de ne pas envoyer de mail rajoutant à la fin de votre commande : « >/dev/null 2>&1 »

Elle devrait donc ressembler à ceci :

  1. php-cli -f /home/utilisateur/public_html/execution_periodique.php >/dev/null 2>&1

Au final, vous obtiendrez :

Tâche Cron CPanel

Voilà ! Vous ne serez désormais plus spammé par les mails de Cron !


Félicitations ! Vous savez désormais lancer des scripts php périodiquement grâce à votre CPanel !

 

 

Suivez le guide ! Test basique : s'envoyer un email

Nous allons maintenant lancer un petit test pour vérifier que notre configuration fonctionne bien. Pour cela, nous allons... nous spammer nous-même !

Rien de bien méchant je vous rassure !

Commencez par créer une page de base très classique :

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3.   <head>
  4.     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5.     <title>Test de Cron</title>
  6.   </head>
  7.   <body>
  8.     <!-- Insérer ici le code de mail php -->
  9.   </body>
  10. </html>

Puis insérez le petit script Php pour le mail (pensez à bien mettre votre mail!) :

  1. <?php
  2. // Destinataire
  3. $to = "webmaster@votre_site.com";
  4. // Sujet
  5. $subject = 'Test de planification de tâche Cron';
  6.  
  7. // Message
  8. $message = '
  9. <html>
  10.   <head>
  11.     <title>Test Cron</title>
  12.   </head>
  13.   <body>
  14.     <table width="100%" border="0" cellspacing="0" cellpadding="5">
  15.       <tr>
  16.         <td align="center">
  17.           <p>
  18.             Ceci est un test qui prouve que Cron fonctionne correctement !
  19.           </p>
  20.           <p>
  21.             Chouette, hein ?
  22.           </p>
  23.         </td>
  24.       </tr>
  25.     </table>
  26.   </body>
  27. </html>
  28. ';
  29.  
  30. // Pour envoyer un mail HTML, l en-tête Content-type doit être défini
  31. $headers = "MIME-Version: 1.0" . "\n";
  32. $headers .= "Content-type: text/html; charset=utf-8" . "\r\n";
  33.  
  34. // En-têtes additionnels
  35. $headers .= 'From: Mail de test <no-reply@monsitedetest.com>' . "\r\n";
  36.  
  37. // Envoie
  38. $resultat = mail($to, $subject, $message, $headers);
  39. ?>
  40.  

Sauvegardez cette page sous, par exemple, « test.php » et envoyez là à la racine de votre hébergement.

Ajoutez alors une tâche Cron qui va appeler ce script toute les minutes :

  1. * * * * * php-cli -f /home/utilisateur/public_html/test.php >/dev/null 2>&1


Vous n'avez plus qu'à attendre une petit minute pour vérifier votre boite mail et vous prouver le bon fonctionnement des tâches Cron !

Sachez que depuis ce script, vous pouvez avoir accès à toutes les ressources Php classiques comme si vous appeliez cette page depuis votre propre navigateur.

Vous pouvez donc avoir accès aux bases de données sans aucun problème ! Vous pouvez aussi appeler d'autres scripts Php à partir de celui-ci, générez des fichiers PDF... en somme tout ce que vous pouvez faire en temps normal !

Pensez à supprimer le script une fois le test effectué ! Vous ne voudriez pas 300 mails dans votre boite le matin parce que vous l'avez oublié en allant vous coucher !