5

I am developing a webserver that invokes the PHP binary (via CGI) to process a script.

Here's the problem:

The PHP script isn't picking up the command line parameters. For example, if the client requests path/to/file.php?test=value, the $_GET array is empty.

I have tried passing the parameters in an environment variable (QUERY_STRING), but they still don't show up.

How can I pass query string parameters to a PHP application?

4 Answers 4

5

There are various SAPIs for PHP. One of them is cli SAPI which apparently is what you're using, cli SAPI wouldn't populate $_GET, $_POST ... because it's for command line scripting.

In your case you need PHP cgi SAPI. (e.g., You need to replace php with php-cgi[1] in your shebang)

[1] In most distribuitons it's called php-cgi, if you compile PHP yourself you need to enable cgi.

Sign up to request clarification or add additional context in comments.

3 Comments

Ah, that explains it. Thanks!
when you dont have php-cgi but want to simulate calling php in a cgi context what do you do then?
To spell it out, you'd run php-cgi file.php a=1 b=2.
4

Are you talking about command line parameters or $_GET parameters? Those are not the same.

When using a webbrowser, $_GET is used. But if you're passing command line arguments like /path/to/file.php arg1 arg2, then you have to use $argv (and $argc contains the length of elements).

$argv[0] always contains the running file, in this example /path/to/file.php.
$argv[1] is arg1 in this case and $argv[2] is arg2. So $argc contain 3.

Helpful resources:

Comments

4

As mentioned in Don’t call me DOM » Testing CGI scripts with QUERY_STRING, in PHP, you may have to use parse_str to parse environment variables passed via cli mode - example in Linux terminal:

$ QUERY_STRING="aa=bb&cc=dd" php -r 'parse_str(getenv("QUERY_STRING"),$_GET); print_r($_GET);'
Array
(
    [aa] => bb
    [cc] => dd
)

1 Comment

Can you add some information about the environment variables? E.g., their names (particular names or by convention. Possible name collisions. Etc.). Length restrictions (Linux, Windows, etc.). Etc. (Without "Edit:", "Update:", or similar - the answer should appear as if it was written today.)
1

-- Option 1: php-cgi --

Use 'php-cgi' in place of 'php' to run your script. This is the simplest way as you won't need to specially modify your PHP code to work with it:

php-cgi -f /my/script/file.php a=1 b=2 c=3

-- Option 2: if you have a web server --

If the php file is on a web server you can use 'wget' on the command line:

wget 'http://localhost/my/script/file.php?a=1&b=2&c=3'

OR:

wget -q -O - "http://localhost/my/script/file.php?a=1&b=2&c=3"

-- Accessing the variables in php --

In both option 1 & 2 you access these parameters like this:

$a = $_GET["a"];
$b = $_GET["b"];
$c = $_GET["c"];

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.