Каков канонический способ определения командной строки и http-выполнения PHP-скрипта?
У меня есть php-скрипт, который должен определить, был ли он выполнен через командную строку или через HTTP, в первую очередь для целей форматирования вывода. Что канонический способ сделать это? Я думал, что это для осмотра SERVER['argc']
, но оказывается, что это заполняется, даже при использовании API сервера' Apache 2.0 Handler'.
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 может работать, и определить имена всех возможных типов интерфейса для каждого сервера. Просто убедитесь, что этот список обновляется по мере добавления новых веб-серверов и интерфейсов.