Есть ли способ отличить, вызван ли сценарий из командной строки или веб-сервера?
( См. Каков канонический способ определения командной строки и HTTP-исполнения скрипта PHP? Для получения лучшего ответа и более подробного обсуждения – не нашел этого перед публикацией)
У меня есть (непроизводственный) сервер с Apache 2.2.10 и PHP 5.2.6. На нем в каталоге, доступном в Интернете, есть мой PHP-скрипт, maintenance_tasks.php
. Я хотел бы вызвать этот скрипт из командной строки или через HTTP-запрос (открыв в браузере). Есть ли какая-то переменная, которая позволяет мне надежно определять, как скрипт вызывается?
(Я уже занимался проблемами разных представлений для каждого типа запросов и тайм-аута ответа HTTP, просто ищет способ рассказать обо всех типах вызовов)
Я попробую разные вещи и добавлю свои выводы ниже.
Duplicate: Каков канонический способ определения командной строки и HTTP-исполнения скрипта PHP?
Если вызывается из командной строки, переменная сервера 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, но я не уверен, что это достаточно надежный.)