Может ли PHP определить, выполняется ли его запуск из задания cron или из командной строки?



Answers

Вы можете настроить дополнительный параметр или добавить строку в свой crontab, возможно:

CRON=running

А затем вы можете проверить переменные среды для «CRON». Кроме того, попробуйте проверить переменную $ SHELL, я не уверен, что / cron устанавливает ее.

Question

Я ищу путь к PHP, чтобы определить, был ли сценарий запущен из ручного вызова в оболочке (я вхожу в систему и запускаю его), или если он был запущен из записи crontab.

У меня есть различные сценарии типа обслуживания, написанные на php, которые я установил для запуска в моем crontab. Иногда, и мне нужно запустить их вручную досрочно или если что-то не получилось / сломано, мне нужно запустить их пару раз.

Проблема заключается в том, что у меня также есть некоторые внешние уведомления, заданные в задачах (отправка сообщений в твиттер, отправка электронной почты и т. Д.), Которые я НЕ хочу делать каждый раз, когда запускаю скрипт вручную.

Я использую php5 (если это имеет значение), это довольно стандартная среда сервера linux.

Есть идеи?




Я считаю, что наиболее универсальным решением является добавление переменной окружения в команду cron и поиск ее в коде. Он будет работать на каждой системе.

Если команда, выполняемая cron, является, например:

"/usr/bin/php -q /var/www/vhosts/myuser/index.php"

Измените его на

"CRON_MODE=1 /usr/bin/php -q /var/www/vhosts/myuser/index.php"

Затем вы можете проверить его на код:

if (!getenv('CRON_MODE'))
    print "Sorry, only CRON can access this script";



В моей среде я обнаружил, что TERM был установлен в $_SERVER если он запущен из командной строки, но не установлен, если он выполняется через Apache в качестве веб-запроса. Я поставил это в верхней части моего сценария, который я мог бы запустить из командной строки или получить доступ через веб-браузер:

if (isset($_SERVER{'TERM'}))
{
    class::doStuffShell();
}
else
{
    class::doStuffWeb();
}



posix_isatty(STDOUT) return FALSE если результат вызова cli перенаправляется (канал или файл) ...




$_SERVER['SESSIONNAME'] содержит Console если она запущена из CLI. Может быть, это помогает.




Не то, что я знаю - возможно, самым простым решением является предоставление дополнительного параметра самому, чтобы сказать скрипту, как он был вызван.




Это легко для меня ... Просто count($_SERVER['argc']) и если у вас есть результат выше нуля, у него закончится сервер. Вам просто нужно добавить к своей переменной $_SERVER['argv'] вашу пользовательскую переменную, например "CronJob"=true;




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";   
}



В команде cron добавьте ?source=cron в конец пути к скрипту. Затем в вашем скрипте проверьте $_GET['source'] .

EDIT: извините, это сценарий оболочки, поэтому нельзя использовать qs. Вы можете, я думаю, передать аргументы в форме php script.php arg1 arg2 а затем прочитать их с помощью $argv .




Я думаю, было бы лучше запустить комманд cron с дополнительной опцией в командной строке, которую вы не запускали вручную.

cron будет делать:

command ext_updates=1

руководство сделало бы:

command 

Просто добавьте параметр в самом скрипте, чтобы параметр ext_updates имел значение false по умолчанию.






Links



Tags

php php   cron