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






Я думаю
$_SERVER['REMOTE_ADDR']
не будет заполняться из интерфейса командной строки.
Кроме того, все ключи HTTP_ * в суперглобале $ _SERVER не будут заполнены из интерфейса командной строки или сделают это правильно, как только что упомянуто :-)
Используйте функцию php_sapi_name().
if (php_sapi_name() == "cli") {
// In cli-mode
} else {
// Not in cli-mode
}
Вот некоторые важные примечания из документов:
php_sapi_name — Returns the type of interface between web server and PHP
Although not exhaustive, the possible return values include aolserver, apache, apache2filter, apache2handler, caudium, cgi (until PHP 5.3), cgi-fcgi, cli, cli-server, continuity, embed, isapi, litespeed, milter, nsapi, phttpd, pi3web, roxen, thttpd, tux, and webjames.
В PHP> = 4.2.0 также есть предопределенная константа PHP_SAPI, которая имеет то же значение, что и php_sapi_name().
если, конечно, возвращенная строка не была «cgi», что также указывает на то, что php выполняется с консоли. Как в моем случае.
@Adriano: возможно, в вашем случае php-cgi используется для выполнения скрипта.
@Bobby, пример в документации php.net фактически соответствует как «cgi», так и «cgi-fcgi», просто глядя на первые три символа строки ... вот почему, и это действительно имеет смысл. Во всяком случае, это просто вернуть @hop за то, что он назвал php не языком для серьезных программистов: D
интересное примечание: php.net/manual/en/function.php-sapi-name.php заключается в том, что в зависимости от фактического вызываемого двоичного файла вы можете запустить php из командной строки и все равно получить cgi-fgi
Этот фрагмент не является внедорожником: когда PHP запускается как CGI, функция php_sapi_name возвращает то же значение в HTTP или командной строке (пример: 'cgi-fcgi'). Это лучшие решения.
(php_sapi_name () == "cli" || die ("Только командная строка")); в верхней части вашего скрипта
На странице документации для php_sapi_name четко указано, как это работает:
Returns a lowercase string that describes the type of interface (the Server API, SAPI) that PHP is using....
Although not exhaustive, the possible return values include aolserver, apache, apache2filter, apache2handler, caudium, cgi (until PHP 5.3), cgi-fcgi, cli, continuity, embed, isapi, litespeed, milter, nsapi, phttpd, pi3web, roxen, thttpd, tux, and webjames.
Я не уверен, почему Хоп не думает, что PHP предназначен для серьезных программистов (я серьезный программист и использую PHP ежедневно), но если он хочет помочь прояснить документацию, то, возможно, он сможет проверить все возможные веб-серверы. что PHP может работать и определять имена всех возможных типов интерфейса для каждого сервера. Просто не забывайте обновлять этот список по мере добавления новых веб-серверов и интерфейсов.
Также Бобби сказал:
I'm intrigued as to why the doc. example inspects the first 3 characters, whilst the description states the string should be exactly "CGI"
Описание примера гласит:
This example checks for the substring cgi because it may also be cgi-fcgi.
Ах, либо я был невероятно ненаблюдаемым в тот день, либо пример был обновлен с тех пор, как я сделал этот комментарий. Тем не менее, полностью согласен с вашим мнением о PHP; избиение становится ОЧЕНЬ утомительным.
Это всегда будет работать. (Если версия PHP 4.2.0 или выше)
define('CLI', PHP_SAPI === 'cli');
Это упрощает использование в верхней части ваших скриптов:
<?php PHP_SAPI === 'cli' or die('not allowed');
Ваш второй фрагмент кажется неполным, я бы ожидал, что CLI or die('not allowed');
@Madbreaks, я говорил о двух разных вариантах использования. Я предполагал, что либо одно или другое, но если вы используете оба, то CLI or die('not allowed'); идеален.
Which makes it easy to use at the top of your scripts на самом деле не выглядит как два разных использования. Да, я некромант.
Вот реализация 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'
Спасибо. Я заинтригован, почему документ. Пример проверяет первые 3 символа, в то время как в описании указано, что строка должна быть в точности «cgi», но, в остальном, я думаю, что это идеально.