Premiers pas avec l'h̩bergeur O2Switch Рles t̢ches planifi̩es (cron)

 

Comme tout hébergeur le devrait (n'est-ce pas Ikoula ?), O2Switch propose un outil permettant de planifier des tâches, plus familièrement appelé Cron. Ces tâches sont exécutées comme si elles étaient appelées en ligne de commande. C'est très pratique, par exemple pour planifier une sauvegarde nocturne, la suppression de fichiers temporaires, l'envoi d'une newsletter hebdomadaire, la publication automatisée de tweets…

Par rapport à un hébergement mutualisé de chez OVH, l'outil est beaucoup plus évolué. On se rapproche des conditions d'un serveur dédié :

  • il permet de planifier de manière beaucoup plus précise : à la minute près !
  • on peut  exécuter une tâche toutes les 5 minutes (chez OVH, c'est toutes les heures)
  • l'outil envoie un mail à chaque exécution (alors que chez OVH, on a droit à un mail lors des 10 premières exécutions, après il faut relancer manuellement… ou ajouter du code d'envoi de mail dans le script exécuté).
  • l'utilisation de la commande wget est autorisée
  • O2switch propose une console pour tester

Il ne manque qu'une case à cocher « activer/désactiver », et un lien « tester » pour exécuter immédiatement la tâche à des fins de test, et l'outil sera parfait.

Comme toujours, O2Switch propose un article très bien fait sur le sujet.

Rendez-vous dans votre cPanel > Avancé > Tâches cron.

Dans la 1e moitié de la page, vous pouvez déjà commencer par paramétrer l'adresse mail qui recevra le mail de notification suite à l'exécution.

 

E-mail de notification des tâches cron

Un exemple tout simple

L'assistant permet de paramétrer facilement et avec précision le moment d'exécution de notre tâche. Le déroulant « Paramètres communs » est un raccourci permettant de remplir automatiquement les autres champs à partir de cas fréquemment utilisés (« toutes les minutes », « une fois par semaine », « une fois par mois »).

Si vous ne trouvez pas votre cas personnel parmi ces cas courants, ou que vous voulez affiner un peu, vous allez pouvoir paramétrer votre tâche avec précision grâce aux champs situés en-dessous. Si vous ne connaissez pas la syntaxe crontab, je vous conseille d'avoir recours aux déroulants de droite, qui vont remplir les champs à leur gauche.

Ajout d'une tâche cron

Ensuite, vous allez renseigner le nom du script à exécuter. C'est de loin le plus délicat…

IMPORTANT : il faut utiliser le chemin absolu depuis la racine de l'hébergement, qui commence par /home/votrecompte (évidemment, pensez à remplacer « votrecompte » par votre nom de compte !). Voici un exemple pour le site principal (celui qui est situé dans /public_html)

php -q /home/votrecompte/public_html/backup/index.php

Si c'est un site secondaire (ici, placé dans /sites/mondomaine.ovh/)

php -q /home/votrecompte/sites/mondomaine.ovh/backup/index.php

Particularité : si, à l'intérieur de votre script php, vous avez des appels à d'autres scripts (sous la forme d'include ou de require), il faut également utiliser ce chemin absolu. Exemple :

require("/home/votrecompte/public_html/includes/functions.php");
include("/home/votrecompte/public_html/includes/phpmailer.php");

Ou plus simplement :

require(__DIR__."/includes/functions.php"); 
include(__DIR__."/includes/phpmailer.php");

Sans oublier le slash après le __DIR__

Une fois qu'on a cliqué sur « Ajouter une nouvelle tâche cron », celle-ci apparaît dans la liste. Il ne reste plus qu'à tester avec la console (attention le test avec la console ne reproduit pas 100% des conditions d'exécution du cron) ou attendre le moment de l'exécution pour vérifier qu'on a correctement paramétré notre tâche…

Liste des tâches cron

Modifier une tâche cron existante

Cliquer sur le bouton Modifier correspondant à la tâche qu'on souhaite éditer. On remarque l'absence des déroulants de l'assistant en mode édition…

Modifier une tâche cron

Passer des paramètres au script

Les variables $_GET et $_POST n'existent pas quand on exécute un script php en ligne de commande. Comment faire alors pour passer un ou plusieurs paramètres à notre script ? Tout simplement en les écrivant à la suite du nom du script, séparés par des espaces.

php /home/votrecompte/public_html/backup/index.php "monparametre"

Les paramètres se récupèrent dans une variable nommée $argv, un array contenant tous les paramètres. Attention, le chemin vers le script est déjà lui-même considéré comme un paramètre. Donc on commence à $argv[1] et non pas $argv[0].

Si cela ne fonctionne pas (erreur « undefined variable »), il faut activer register_argc_argv dans php.ini. Ce se passe dans Logiciel > Sélectionner une version de php > Switch to php options.

Ou bien vous pouvez mentionner le chemin complet vers la commande php

/usr/local/bin/php /home/votrecompte/public_html/backup/index.php "monparametre"

On peut également utiliser getopt(). Pour en savoir plus sur $argv, vous pouvez jeter un œil à la documentation officielle.

Se débarrasser de l'en-tête affiché dans le mail

Par défaut, le mail que l'on reçoit débute par ce paragraphe :

X-Powered-By: PHP/5.6.33
Content-type: text/html; charset=UTF-8

Alors que nous, on voudrait juste voir le résultat de l'exécution du script. Pour le supprimer, rajouter l'argument -q (pour quiet) juste après le php

php -q /home/votrecompte/public_html/backup/index.php

Cet argument n'est pas considéré comme un paramètre. C'est à dire qu'on n'est pas obligé de récupérer notre paramètre dans $argv[2] au lieu de $argv[1]…

Et, comme toujours, pensez à remplacer « votrecompte » par votre nom de compte !

PS : Si à la première exécution vous avez l'erreur « No input file specified. » dans le mail, c'est que vous vous êtes sans doute trompé dans le chemin du fichier à exécuter.

Ne pas recevoir de mail suite à l'exécution

Si votre cron s'exécute tous les quarts d'heure, cela va vite de devenir fastidieux de recevoir 4 mails de retour par heure !

Pour que le cron ne nous envoie pas de mail, on va rediriger vers /dev/null, ce qui revient à rediriger la sortie d'affichage vers une sorte de poubelle.

php /home/votrecompte/sites/public_html/taches/index.php >/dev/null 2>&1

Savoir si le script est exécuté en ligne de commande ou appelé via le navigateur

Utilisez la constante PHP_SAPI. Dans le cas d'O2Switch, elle vaut

  • cgi-fcgi dans le cas où le script est exécuté via le cron
  • cli dans le cas où le script est exécuté via la console (terminal)
  • litespeed dans le cas où appelé via le navigateur

(évidemment chez OVH « cgi-fcgi » ou « fpm-fcgi » signifie appel via navigateur et « cli » via cron, peuvent rien faire comme tout le monde ceux-là)

if(PHP_SAPI=="litespeed"){
   echo $_GET['param']; // si appel via le navigateur 
}
else {
   echo $argv[1]; // si appel via cron
}

 

Souscrire un hébergement chez O2Switch

Karine SANCHE

Partager cet article