Может ли PHP определить, запускается ли он из задания cron или из командной строки? - PullRequest
49 голосов
/ 10 октября 2008

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

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

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

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

Есть идеи?

Ответы [ 21 ]

3 голосов
/ 02 мая 2009

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

if (isset($_SERVER{'TERM'}))
{
    class::doStuffShell();
}
else
{
    class::doStuffWeb();
}
2 голосов
/ 24 августа 2013
getenv('TERM')

Заполнение для SO 30 символов мин.

1 голос
/ 03 марта 2014

Другой вариант - проверить определенную переменную среды, которая устанавливается, когда php-файл вызывается через Интернет, и не устанавливается, если запускается из командной строки.

На моем веб-сервере я проверяю, установлена ​​ли переменная окружения APACHE_RUN_DIR следующим образом:

if (isset($_ENV["APACHE_RUN_DIR"])) {
  // I'm called by a web user
}
else {
  // I'm called by crontab
} 

Чтобы убедиться, что он будет работать на вашем веб-сервере, вы можете поместить фиктивный php-файл на ваш веб-сервер с помощью одного оператора:

<?php var_dump($_ENV);  ?>

Затем 1) загрузите его с помощью веб-браузера и 2) загрузите из командной строки следующим образом

/usr/bin/php /var/www/yourpath/dummy.php

Сравните различия и протестируйте соответствующую переменную.

1 голос
/ 10 октября 2008

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

РЕДАКТИРОВАТЬ: извините, это сценарий оболочки, поэтому не может использовать qs. Я думаю, вы можете передать аргументы в форме php script.php arg1 arg2, а затем прочитать их с помощью $argv.

1 голос
/ 23 января 2009

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

0 голосов
/ 06 марта 2019

На моем сервере Amazon Linux это то, что у меня сработало:

$ isCron = ($ _SERVER ['HOME'] == '/');

Домашний каталог устанавливается на ваш, если вы просто запустите его. Если вы используете sudo для его запуска, домашний каталог имеет значение /root.

0 голосов
/ 23 июня 2012

Это очень просто. Демоны Cron всегда экспортируют переменную окружения MAILTO. Проверьте, существует ли оно и имеет ли оно непустое значение - тогда вы запускаете из cron.

0 голосов
/ 30 января 2009
if(!$_SERVER['HTTP_HOST']) {
 blabla();
}
0 голосов
/ 02 января 2011

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

0 голосов
/ 03 ноября 2010

posix_isatty(STDOUT) return FALSE, если выходные данные вызова cli перенаправлены (канал или файл) ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...