Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

$_SERVER['argv'] with HTTP GET and CLI issue

I'm trying to write down a script to fetch some online data; script should be invoked either by a cron job or php cli and with standard GET HTTP request. As stated on PHP website $_SERVER['argv'] should fit my needs:

Array of arguments passed to the script. When the script is run on the command line, this gives C-style access to the command line parameters. When called via the GET method, this will contain the query string.

However i can't get it to work with standard HTTP GET request. $_SERVER['argv'] is not setted. What i'm missing?

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

CLI output 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:

Notice: Undefined index: argv in jobs/fetch.php.

like image 542
gremo Avatar asked Feb 14 '12 00:02

gremo


1 Answers

The manual didn't state this very well, but, if you want $_SERVER['argc'], $_SERVER['argv'], $argc, $argv to be registered when you are not running in CLI mode, then the php.ini value register_argc_argv needs to be enabled in php.ini (off by default [for performance reasons]).

You could do the following to get argv, or query string args depending on how the script is running:

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

Here are some details from 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

See also http://www.php.net/manual/en/reserved.variables.argv.php and parse_str().

like image 70
drew010 Avatar answered Oct 20 '22 20:10

drew010