Как отличить вызов командной строки и веб-сервера?

Есть ли способ отличить, вызван ли сценарий из командной строки или веб-сервера?

( См. Каков канонический способ определения командной строки и HTTP-исполнения скрипта PHP? Для получения лучшего ответа и более подробного обсуждения – не нашел этого перед публикацией)


У меня есть (непроизводственный) сервер с Apache 2.2.10 и PHP 5.2.6. На нем в каталоге, доступном в Интернете, есть мой PHP-скрипт, maintenance_tasks.php . Я хотел бы вызвать этот скрипт из командной строки или через HTTP-запрос (открыв в браузере). Есть ли какая-то переменная, которая позволяет мне надежно определять, как скрипт вызывается?

(Я уже занимался проблемами разных представлений для каждого типа запросов и тайм-аута ответа HTTP, просто ищет способ рассказать обо всех типах вызовов)

Я попробую разные вещи и добавлю свои выводы ниже.

Duplicate: Каков канонический способ определения командной строки и HTTP-исполнения скрипта PHP?

Related of "Как отличить вызов командной строки и веб-сервера?"

Если вызывается из командной строки, переменная сервера HTTP_USER_AGENT не установлена. Я использую эту константу для определения, вызывается ли сценарий из командной строки или нет:

 define("CLI", !isset($_SERVER['HTTP_USER_AGENT'])); 

ОБНОВЛЕНИЕ: поскольку этот ответ по-прежнему отмечен как «правильный», я хотел бы пересмотреть мой оператор – полагаться на заголовок «Пользователь-агент» может быть проблематичным, так как это определяемое пользователем значение.

Пожалуйста, используйте php_sapi_name() == 'cli' или PHP_SAPI == 'cli' , как было предложено Eugene / cam8001 в комментариях.

Спасибо за указание на это!

Я сравнил $_SERVER в обоих вызовах. Кажется, что $_SERVER['argc'] (то есть количество аргументов, переданных скрипту) устанавливается только при запуске из командной строки:

 <?php if (isset($_SERVER['argc'])) { define('CLI', true); } else { define('CLI', false); } 

Это работает как на Linux, так и на компьютерах Windows. (Сначала я подумал о проверке некоторых переменных среды, но они разные для каждой операционной системы. Кроме того, все заголовки $_SERVER['HTTP_*'] отсутствуют в версии CLI, но я не уверен, что это достаточно надежный.)