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

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

Используйте 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() .

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

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

Это упрощает использование в верхней части ваших скриптов:

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

я думаю

 $_SERVER['REMOTE_ADDR'] 

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

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

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

На странице документации для 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.