$ _SERVER ['argv'] с проблемой HTTP GET и CLI - PullRequest
4 голосов
/ 14 февраля 2012

Я пытаюсь написать скрипт для извлечения некоторых онлайн-данных; Сценарий должен быть вызван либо заданием cron, либо php cli и стандартным GET HTTP-запросом . Как указано на сайте PHP $_SERVER['argv'] должно соответствовать моим потребностям:

Массив аргументов, переданных в скрипт. Когда скрипт запускается на командная строка, это дает доступ в стиле C к командной строке параметры. При вызове через метод GET он будет содержать Строка запроса.

Однако я не могу заставить его работать со стандартным HTTP-запросом GET. $_SERVER['argv'] не установлено. Чего мне не хватает?

<?php
    // jobs/fetch.php
    var_dump($_SERVER['argv']);
?>

Выход CLI php jobs/fetch.php -a -bhello:

array(3) {
  [0]=>
  string(14) "jobs/fetch.php"
  [1]=>
  string(2) "-a"
  [2]=>
  string(7) "-bhello"
}

GET output jobs/fetch.php?a=&b=hello:

Примечание: неопределенный индекс: argv в jobs / fetch.php.

Ответы [ 2 ]

15 голосов
/ 14 февраля 2012

В руководстве не очень хорошо сказано это, но если вы хотите, чтобы $_SERVER['argc'], $_SERVER['argv'], $argc, $argv были зарегистрированы, когда вы не работаете в режиме CLI, тогда php.ini значение register_argc_argv необходимо включить в php.ini (по умолчанию отключено [по соображениям производительности]).

Чтобы получить argv или аргументы строки запроса, можно сделать следующеев зависимости от того, как работает скрипт:

if (php_sapi_name() == 'cli') {
    $args = $_SERVER['argv'];
} else {
    parse_str($_SERVER['QUERY_STRING'], $args);
}

Вот некоторые подробности из php.ini:

; This directive determines whether PHP registers $argv & $argc each time it
; runs. $argv contains an array of all the arguments passed to PHP when a script
; is invoked. $argc contains an integer representing the number of arguments
; that were passed when the script was invoked. These arrays are extremely
; useful when running scripts from the command line. When this directive is
; enabled, registering these variables consumes CPU cycles and memory each time
; a script is executed. For performance reasons, this feature should be disabled
; on production servers.
; Note: This directive is hardcoded to On for the CLI SAPI
; Default Value: On
; Development Value: Off
; Production Value: Off
; http://php.net/register-argc-argv

См. также http://www.php.net/manual/en/reserved.variables.argv.php и parse_str ().

3 голосов
/ 14 февраля 2012

Вам придется использовать $_GET или $_SERVER['argv'] в зависимости от того, как вызывается ваш скрипт. Ни один из них не используется для обоих.

Например:

if(!empty($_SERVER['argv'][0]) {
  $a = $_SERVER['argv'][1];
  $b = $_SERVER['argv'][2];
} else {
  $a = $_GET['a'];
  $b = $_GET['b'];
}
...