Как отличить вызов командной строки и веб-сервера?
Есть ли способ отличить, вызван ли 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, но я не уверен, насколько это достаточно надежным.)