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

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

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


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

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

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

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

Ответ 1

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

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

Забастовкa >

UPDATE:. Поскольку этот ответ по-прежнему отмечен как "правильный", я хотел бы пересмотреть мой оператор. Использование заголовка "User-Agent" может быть проблематичным, поскольку оно пользовательское значение.

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

Спасибо, что указали это!

Ответ 2

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

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

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