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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
158
0
41 346
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Я думаю

$_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().

Спасибо. Я заинтригован, почему документ. Пример проверяет первые 3 символа, в то время как в описании указано, что строка должна быть в точности «cgi», но, в остальном, я думаю, что это идеально.

Bobby Jack 06.10.2008 15:17

если, конечно, возвращенная строка не была «cgi», что также указывает на то, что php выполняется с консоли. Как в моем случае.

Adriano Varoli Piazza 28.09.2009 20:40

@Adriano: возможно, в вашем случае php-cgi используется для выполнения скрипта.

user3850 23.02.2010 18:31

@Bobby, пример в документации php.net фактически соответствует как «cgi», так и «cgi-fcgi», просто глядя на первые три символа строки ... вот почему, и это действительно имеет смысл. Во всяком случае, это просто вернуть @hop за то, что он назвал php не языком для серьезных программистов: D

ChrisR 30.09.2010 15:36

интересное примечание: php.net/manual/en/function.php-sapi-name.php заключается в том, что в зависимости от фактического вызываемого двоичного файла вы можете запустить php из командной строки и все равно получить cgi-fgi

DAB 24.06.2015 22:19

Этот фрагмент не является внедорожником: когда PHP запускается как CGI, функция php_sapi_name возвращает то же значение в HTTP или командной строке (пример: 'cgi-fcgi'). Это лучшие решения.

Skrol29 26.04.2018 13:32

(php_sapi_name () == "cli" || die ("Только командная строка")); в верхней части вашего скрипта

relipse 12.11.2019 01:29

На странице документации для 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; избиение становится ОЧЕНЬ утомительным.

Bobby Jack 10.08.2009 02:30

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

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

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

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

Ваш второй фрагмент кажется неполным, я бы ожидал, что CLI or die('not allowed');

Madbreaks 09.01.2013 08:35

@Madbreaks, я говорил о двух разных вариантах использования. Я предполагал, что либо одно или другое, но если вы используете оба, то CLI or die('not allowed'); идеален.

Xeoncross 09.01.2013 21:16

Which makes it easy to use at the top of your scripts на самом деле не выглядит как два разных использования. Да, я некромант.

George Dimitriadis 08.06.2017 13:08

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

Другие вопросы по теме