PHP – как лучше определить, является ли текущий вызов из CLI или веб-сервера?

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

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

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

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

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

 function isCommandLineInterface() { return (php_sapi_name() === 'cli'); } 

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

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

  • AOLserver
  • апаш
  • apache2filter
  • apache2handler
  • Caudium
  • cgi (до PHP 5.3)
  • CGI-FCGI
  • кли
  • cli-server ( встроенный веб-сервер с PHP 5.4)
  • непрерывность
  • встраивать
  • FPM-FCGI
  • ISAPI
  • LiteSpeed
  • рыба-самец
  • NSAPI
  • phttpd
  • pi3web
  • Roxen
  • thttpd
  • смокинг
  • webjames

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

 return (php_sapi_name() === 'cli' OR defined('STDIN')); 

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

 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; } 

Дайте мне знать, что вы думаете

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), прежде чем вы вызовете это.

 function is_cli() { return !http_response_code(); } 

пример:

 if (is_cli()) { echo 'command line'; } else { echo 'browser'; } 

Пытаться

 isset($_SERVER['REQUEST_METHOD']) 

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

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

 isset($_SERVER['argv']) 

но это может быть неверно для окон CLI, IDK.

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

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

Это от Drush codebase, environment.inc, где у них есть аналогичная проверка.

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

Я бы предложил проверить, установлены ли некоторые из элементов массива $ _SERVER .

Например:

 if (isset($_SERVER['REQUEST_METHOD'])) { print "HTTP request\n"; } else { print "CLI invocation\n"; } 

Мой предпочтительный метод:

 if (array_key_exists('SHELL', $_ENV)) { echo "Console invocation"; } else { echo "HTTP invocation"; } 
 // Detect CLI calls define("IS_CLI_CALL",( strcmp(php_sapi_name(),'cli') == 0 )); if(IS_CLI_CALL){ //do you stuff here } 

joomla way

 if (array_key_exists('REQUEST_METHOD', $_SERVER)) die(); 

Простым способом является опрос переменной $argv (что вы, вероятно, будете делать для параметров командной строки). Даже если нет параметров, $argv возвращает пустой массив.

Если он установлен, то использовался cli. Затем вы можете предположить, что все другие вызовы осуществляются через какой-либо веб-сервер или другой.

например:

 if (isset($argv)) { // Do the cli thing. } 

Я бы попробовал:

 echo exec('whoami'); 

Обычно веб-серверы запускаются под другим именем пользователя, поэтому это должно быть сказано.