Как вы правильно проверяете, определен ли argv в PHP-скрипте? [Дубликат]

На основании предыдущего ответа я создал функцию, которая также может обрабатывать скобки. Но в них нет точек из-за раскола.

function get(obj, str) {
  return str.split(/\.|\[/g).map(function(crumb) {
    return crumb.replace(/\]$/, '').trim().replace(/^(["'])((?:(?!\1)[^\\]|\\.)*?)\1$/, (match, quote, str) => str.replace(/\\(\\)?/g, "$1"));
  }).reduce(function(obj, prop) {
    return obj ? obj[prop] : undefined;
  }, obj);
}
138
задан Greg 5 December 2008 в 12:28
поделиться

5 ответов

Используйте функцию 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().

199
ответ дан DesignerGuy 24 August 2018 в 00:33
поделиться
  • 1
    Благодарю. Я заинтригован, почему док. пример проверяет первые 3 символа, в то время как в описании указано, что строка должна быть точно «cgi». но, кроме этого, я думаю, что это прекрасно. – Bobby Jack 6 October 2008 в 12:17
  • 2
    если, конечно, возвращенная строка не была «cgi», что также указывает на выполнение php с консоли. Как и в случае, когда я знаю, мое дело. – Adriano Varoli Piazza 28 September 2009 в 17:40
  • 3
    @Adriano: возможно, в вашем случае php-cgi используется для выполнения скрипта. – user 23 February 2010 в 16:31
  • 4
    @Bobby, пример в документах php.net фактически соответствует обеим «cgi». и "cgi-fcgi" просто глядя на первые три символа строки ... вот почему, и это действительно имеет смысл. Если что-нибудь, просто верните @hop для вызова php без языка для серьезных программистов: D – ChrisR 30 September 2010 в 12:36
  • 5
    интересная заметка здесь: php.net/manual/en/function.php-sapi-name.php заключается в том, что в зависимости от фактического бинарного вызова вы можете запустить php из командной строки и получить cgi -fgi – DAB 24 June 2015 в 19:19

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

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

Кроме того, Бобби сказал:

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

В описании для примера указано:

В этом примере проверяется для подстроки cgi, поскольку она также может быть cgi-fcgi.

4
ответ дан A J 24 August 2018 в 00:33
поделиться
  • 1
    Ах, или я был невероятно ненаблюдаем в тот день, или пример обновлен, так как я сделал этот комментарий. Тем не менее, всецело согласен с вашими точками о PHP; избиение становится ОЧЕНЬ утомительным. – Bobby Jack 9 August 2009 в 23:30

Я думаю, что

$_SERVER['REMOTE_ADDR']

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

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

8
ответ дан Vinko Vrsalovic 24 August 2018 в 00:33
поделиться

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

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

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

<?php PHP_SAPI === 'cli' or die('not allowed');
21
ответ дан Xeoncross 24 August 2018 в 00:33
поделиться
  • 1
    Ваш второй фрагмент кажется нелогичным, я ожидаю CLI or die('not allowed'); – Madbreaks 9 January 2013 в 06:35
  • 2
    @Madbreaks, я говорил о двух разных применениях. Я принимал либо один или другой, но если вы используете оба, то CLI or die('not allowed'); идеально. – Xeoncross 9 January 2013 в 19:16
  • 3
    Спасибо за разъяснение, +1 – Madbreaks 9 January 2013 в 19:28
  • 4
    Which makes it easy to use at the top of your scripts на самом деле не звучит как два отдельных использования. Да, я некромант. – George Dimitriadis 8 June 2017 в 10: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'

9
ответ дан ya.teck 24 August 2018 в 00:33
поделиться
  • 1
    это будет работать и при запуске php-cgi, отлично! – Jakob Eriksson 20 September 2013 в 13:55
Другие вопросы по тегам:

Похожие вопросы: