PHP - как наилучшим образом определить, является ли текущий вызов из CLI или веб-сервера? - PullRequest
180 голосов
/ 01 июня 2009

Мне нужно определить, является ли текущий вызов PHP из командной строки (CLI) или с веб-сервера (в моем случае, Apache с mod_php).

Любые рекомендуемые методы?

Ответы [ 18 ]

290 голосов
/ 01 июня 2009

php_sapi_name - это функция, которую вы хотите использовать, так как она возвращает строчную строку типа интерфейса. Кроме того, есть постоянная PHP PHP_SAPI.

Документацию можно найти здесь: http://php.net/php_sapi_name

Например, чтобы определить, запускается ли PHP из CLI, вы можете использовать эту функцию:

function isCommandLineInterface()
{
    return (php_sapi_name() === 'cli');
}
30 голосов
/ 22 сентября 2014

Я использую эту функцию в течение нескольких лет

function is_cli()
{
    if ( defined('STDIN') )
    {
        return true;
    }

    if ( php_sapi_name() === 'cli' )
    {
        return true;
    }

    if ( array_key_exists('SHELL', $_ENV) ) {
        return true;
    }

    if ( empty($_SERVER['REMOTE_ADDR']) and !isset($_SERVER['HTTP_USER_AGENT']) and count($_SERVER['argv']) > 0) 
    {
        return true;
    } 

    if ( !array_key_exists('REQUEST_METHOD', $_SERVER) )
    {
        return true;
    }

    return false;
}
27 голосов
/ 31 декабря 2016

php_sapi_name() на самом деле не лучший способ выполнить эту проверку, потому что она зависит от проверки на множество возможных значений. Бинарный файл php-cgi может быть вызван из командной строки, из сценария оболочки или как задание cron, и (в большинстве случаев) они также должны рассматриваться как 'cli', но php_sapi_name() будет возвращать для них разные значения (обратите внимание, что это не относится к простой версии PHP, но вы хотите, чтобы ваш код работал где угодно, верно?). Не говоря уже о том, что в следующем году могут появиться новые способы использования PHP, о которых мы не можем знать сейчас. Я бы предпочел не думать об этом, когда все, что меня волнует, это погода, я должен обернуть вывод в HTML или нет.

К счастью, в PHP есть способ проверить это специально. Просто используйте http_response_code() без каких-либо параметров, и он вернет TRUE, если он запускается из среды типа веб-сервера, и FALSE, если он запускается из среды типа CLI. Вот код:

$is_web=http_response_code()!==FALSE;

Это будет даже работать, если вы случайно (?) Установили код ответа из скрипта, запущенного из CLI (или что-то вроде CLI), прежде чем вызывать это.

23 голосов
/ 01 июня 2009

Я думаю, он имеет в виду, вызывается ли CLI PHP или это ответ от веб-запроса. Лучше всего было бы использовать php_sapi_name(), который, если бы он выполнял веб-запрос, повторял бы Apache, если это то, что он выполнял.

К списку нескольких взятых из php документов по php_sapi_name():

  • aolserver
  • apache
  • apache2filter
  • apache2handler
  • каудий
  • cgi (до PHP 5.3)
  • cgi-fcgi
  • cli
  • cli-сервер ( встроенный веб-сервер с PHP 5.4)
  • непрерывность
  • код для вставки
  • fpm-fcgi
  • Исапи
  • малая скорость
  • Милтер
  • нсапи
  • phttpd
  • pi3web
  • roxen
  • thttpd
  • пингвин
  • webjames
13 голосов
/ 17 января 2014

Это должно обрабатывать все случаи (включая php-cgi)

return (php_sapi_name() === 'cli' OR defined('STDIN'));
5 голосов
/ 15 февраля 2017
function is_cli() {
    return !http_response_code();
}

пример:

if (is_cli()) {
    echo 'command line';
} else {
    echo 'browser';
}
4 голосов
/ 16 апреля 2013

Я использовал это:

php_sapi_name() == 'cli' || (is_numeric($_SERVER['argc']) && $_SERVER['argc'] > 0)

Это из кодовой базы Drush, environment.inc, где они проводят аналогичную проверку.

3 голосов
/ 01 июня 2009

Попробуйте

isset($_SERVER['REQUEST_METHOD'])

если установлено, вы в браузере.

Кроме того, вы можете проверить, если

isset($_SERVER['argv'])

но это может быть неверно в Windows CLI, IDK.

1 голос
/ 02 сентября 2014

Joomla Way

if (array_key_exists('REQUEST_METHOD', $_SERVER)) die();
1 голос
/ 01 июня 2009

Согласно http://jp2.php.net/manual/en/features.commandline.php Существует ряд констант, установленных только при запуске из CLI. Этими константами являются STDIN, STDOUT и STDERR. Тестирование одного из них покажет вам, находится ли он в режиме cli

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