У меня есть PHP script, который должен определить, был ли он выполнен через командную строку или через HTTP, в основном для целей форматирования вывода. Каков канонический способ сделать это? Я думал, что нужно проверить SERVER['argc']
, но, оказывается, это заполняется даже при использовании API-сервера API Apache 2.0 Handler.
Каков канонический способ определения командной строки и HTTP-выполнения PHP скрипт?
Ответ 1
Используйте php_sapi_name()
.
if (php_sapi_name() == "cli") {
// In cli-mode
} else {
// Not in cli-mode
}
Вот некоторые важные примечания из документов:
php_sapi_name - возвращает тип интерфейса между веб-сервером и PHP
Хотя и не исчерпывающий, возможные возвращаемые значения включают aolserver, apache, apache2filter, apache2handler, caudium, cgi (до PHP 5.3), cgi-fcgi, cli, cli-server, непрерывность, встраивание, isapi, litespeed, milter, nsapi, phttpd, pi3web, roxen, thttpd, tux и webjames.
В PHP >= 4.2.0 существует также предопределенная константа PHP_SAPI
, которая имеет то же значение, что и php_sapi_name()
.
Ответ 2
Это всегда будет работать. (Если версия PHP равна 4.2.0 или выше)
define('CLI', PHP_SAPI === 'cli');
Это упрощает использование в верхней части ваших скриптов:
<?php PHP_SAPI === 'cli' or die('not allowed');
Ответ 3
Я думаю,
$_SERVER['REMOTE_ADDR']
не будет заполнен из CLI.
Кроме того, все HTTP_ * ключи в супергелбале $_SERVER не будут заполнены из CLI, или это будет только что упомянутый способ: -)
Ответ 4
Вот реализация Drupal 7: drupal_is_cli():
function drupal_is_cli() {
return (!isset($_SERVER['SERVER_SOFTWARE']) && (php_sapi_name() == 'cli' || (is_numeric($_SERVER['argc']) && $_SERVER['argc'] > 0)));
}
Однако Drupal 8 рекомендует с помощью PHP_SAPI === 'cli'
Ответ 5
На странице документации для php_sapi
_name четко указано, как она работает:
Возвращает строчную строку, описывающую тип интерфейса (API-интерфейс сервера, SAPI), который использует PHP.
Хотя и не исчерпывающий, возможные возвращаемые значения включают aolserver, apache, apache2filter, apache2handler, caudium, cgi (до PHP 5.3), cgi-fcgi, cli, непрерывность, встраивание, isapi, litespeed, milter, nsapi, phttpd, pi3web, roxen, thttpd, tux и webjames.
Я не уверен, почему хоп не думает, что PHP для серьезных программистов (я серьезный программист, и я ежедневно использую PHP), но если он хочет помочь прояснить документацию, возможно, он сможет провести аудит всех возможные веб-серверы, на которых может работать PHP, и определять имена всех возможных типов интерфейсов для каждого сервера. Просто убедитесь, что этот список обновлен по мере добавления новых веб-серверов и интерфейсов.
Кроме того, Бобби сказал:
Я заинтригован, почему док. пример проверяет первые 3 символа, в то время как в описании указано, что строка должна быть точно "CGI"
В описании для примера указано:
В этом примере проверяется подстрока cgi, поскольку она также может быть cgi-fcgi.