Каков канонический способ определения выполнения командной строки и http-скрипта PHP? - PullRequest
151 голосов
/ 06 октября 2008

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

Ответы [ 5 ]

218 голосов
/ 06 октября 2008

Используйте функцию 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().

21 голосов
/ 09 декабря 2010

Это всегда будет работать. (Если версия PHP 4.2.0 или выше)

define('CLI', PHP_SAPI === 'cli');

Что облегчает использование в верхней части ваших скриптов:

<?php PHP_SAPI === 'cli' or die('not allowed');
9 голосов
/ 29 сентября 2012

Вот реализация 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'

8 голосов
/ 06 октября 2008

Я думаю

$_SERVER['REMOTE_ADDR']

не будет заполняться из CLI.

Кроме того, все ключи HTTP_ * в суперглобальном переменной $ _SERVER не будут заполняться из CLI, или делать это правильно, как только что упомянуто: -)

4 голосов
/ 05 августа 2009

На странице документации для php_sapi _name четко указано, как это работает:

Возвращает строчную строку, которая описывает тип интерфейса (API сервера, SAPI), который использует PHP ....

Хотя это и не исчерпывающее значение, возможные возвращаемые значения включают aolserver, apache, apache2filter, apache2handler, caudium, cgi (до PHP 5.3), cgi-fcgi, cli, непрерывность, embed, isapi, litespeed, milter, nsapi, phttpd, pi3web , roxen, thttpd, tux и webjames.

Я не уверен, почему Хоп не думает, что PHP предназначен для серьезных программистов (я серьезный программист, и я использую PHP ежедневно), но если он хочет помочь прояснить документацию, то, возможно, он может проверить все возможные веб-серверы, на которых может работать PHP, и определяют имена всех возможных типов интерфейсов для каждого сервера. Просто убедитесь, что этот список обновляется по мере добавления новых веб-серверов и интерфейсов.

Также Бобби сказал:

Я заинтригован тем, почему док. Пример проверяет первые 3 символа, в то время как в описании говорится, что строка должна быть точно "CGI"

Описание для примера гласит:

В этом примере проверяется подстрока cgi, поскольку она также может быть cgi-fcgi.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...