63 votes

PHP peut-il détecter s'il est exécuté depuis une tâche cron ou depuis la ligne de commande ?

Je cherche un moyen pour le PHP de détecter si un script a été exécuté à partir d'une invocation manuelle sur un shell (moi me connectant et l'exécutant), ou s'il a été exécuté à partir de l'entrée crontab.

J'ai divers scripts de type maintenance écrits en php que j'ai configurés pour être exécutés dans ma crontab. Occasionnellement, et j'ai besoin de les exécuter manuellement en avance sur le calendrier ou si quelque chose a échoué / cassé, j'ai besoin de les exécuter plusieurs fois.

Le problème est que j'ai aussi des notifications externes dans les tâches (publication sur Twitter, envoi d'un e-mail, etc.) que je ne veux PAS voir se produire chaque fois que je lance le script manuellement.

J'utilise php5 (si cela a de l'importance), c'est un environnement de serveur linux assez standard.

Des idées ?

47voto

Paul Stone Points 1506

Au lieu de détecter quand le script est exécuté depuis la crontab, il est probablement plus facile de détecter quand vous l'exécutez manuellement.

Il existe un grand nombre de variables d'environnement (dans le tableau $_ENV) qui sont définies lorsque vous exécutez un script à partir de la ligne de commande. Ces variables varient en fonction de la configuration de votre serveur et de la façon dont vous vous connectez. Dans mon environnement, les variables d'environnement suivantes sont définies lors de l'exécution manuelle d'un script et ne sont pas présentes lors de l'exécution par cron :

  • TERME
  • SSH_CLIENT
  • SSH_TTY
  • SSH_CONNECTION

Il y en a d'autres aussi. Ainsi, par exemple, si vous utilisez toujours SSH pour accéder à la boîte, alors la ligne suivante détectera si le script est exécuté depuis cron :

$cron = !isset($_ENV['SSH_CLIENT']);

44voto

MingalevME Points 136
if (php_sapi_name() == 'cli') {   
   if (isset($_SERVER['TERM'])) {   
      echo "The script was run from a manual invocation on a shell";   
   } else {   
      echo "The script was run from the crontab entry";   
   }   
} else { 
   echo "The script was run from a webserver, or something else";   
}

30voto

Matthew Scharley Points 43262

Vous pouvez configurer un paramètre supplémentaire, ou ajouter une ligne dans votre crontab, peut-être :

CRON=running

Ensuite, vous pouvez vérifier vos variables d'environnement pour "CRON". Essayez également de vérifier la variable $SHELL, je ne suis pas sûr que cron la définisse.

30voto

Voici ce que j'utilise pour découvrir d'où le script est exécuté. Regardez la fonction php_sapi_name pour plus d'informations : http://www.php.net/manual/en/function.php-sapi-name.php

if(php_sapi_name() == 'cli' || empty($_SERVER['REMOTE_ADDR'])) {
    echo "shell";
} else {
    echo "webserver";
}

17voto

La bonne approche consiste à utiliser la fonction posix_isatty() sur le descripteur de fichier stdout, par exemple, comme suit :

if (posix_isatty(STDOUT))
    /* do interactive terminal stuff here */

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X