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


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

5 140

5 ответов:

использовать php_sapi_name()

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

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

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

<?php PHP_SAPI === 'cli' or die('not allowed');

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

Я думаю

$_SERVER['REMOTE_ADDR']

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

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

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

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

хотя и не исчерпывающий, возможные возвращаемые значения включают aolserver, Апач, apache2filter, apache2handler, caudium, CGI программы (до версии PHP 5.3), в CGI-fcgi по, интерфейс командной строки, непрерывность, размещения, хранения, litespeed, программа, nsapi, phttpd, pi3web, Роксен, thttpd, смокинг, и веб-игры.

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