$ _SERVER с сообщением HTTP GET и CLI

Я пытаюсь записать скрипт для получения некоторых онлайн-данных; сценарий должен быть вызван либо заданием cron, либо php cli, и со стандартным HTTP-запросом GET . Как указано на веб-сайте 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 выходные jobs/fetch.php?a=&b=hello :

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

В руководстве это не указано, но если вы хотите $_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 () .

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

Например:

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