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

У меня есть PHP script, который должен определить, был ли он выполнен через командную строку или через HTTP, в основном для целей форматирования вывода. Каков канонический способ сделать это? Я думал, что нужно проверить SERVER['argc'], но, оказывается, это заполняется даже при использовании API-сервера API Apache 2.0 Handler.

Ответ 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.