PHP, pass parameters from command line to a PHP script
Asked Answered
L

9

45

I want to pass parameters from PHP Command Line Interface, and then read in the values using PHP script, something like this:

<?php
  $name1 = $argv[1];    
  echo $name1;
?>

I pass the variable from CLI like this:

C:\xampp\php\php.exe name.php Robby

The above works, I get Robby as the output.

But I want to do something like this:

C:\xampp\php\php.exe name.php -inputFirstName="Robby"

So that the user is well informed to enter the correct parameters in the correct places. What is the appropriate way to parse these parameters?

Lundt answered 15/6, 2012 at 10:20 Comment(0)
C
56

When calling a PHP script from the command line you can use $argc to find out how many parameters are passed and $argv to access them. For example running the following script:

<?php
    var_dump($argc); //number of arguments passed 
    var_dump($argv); //the arguments passed
?>

Like this:-

php script.php arg1 arg2 arg3

Will give the following output

int(4)
array(4) {
  [0]=>
  string(21) "d:\Scripts\script.php"
  [1]=>
  string(4) "arg1"
  [2]=>
  string(4) "arg2"
  [3]=>
  string(4) "arg3"
}

See $argv and $argc for further details.

To do what you want, lets say

php script.php arg1=4

You would need to explode the argument on the equals sign:-

list($key, $val) = explode('=', $argv[1]);
var_dump(array($key=>$val));

That way you can have whatever you want in front of the equals sign without having to parse it, just check the key=>value pairs are correct. However, that is all a bit of a waste, just instruct the user on the correct order to pass the arguments.

Chumash answered 15/6, 2012 at 10:38 Comment(4)
"This variable is not available when register_argc_argv is disabled".Wives
Just a side note / question: What is the reason of :- instead of just : in your answer?Asta
@Asta It is just a personal preference. I think :- looks better than : No other reason :)Chumash
@Chumash exquisite taste, sir. I too have a predilection for noses. =]Zamora
I
24

I use this fairly concise method:

if($argc>1)
  parse_str(implode('&',array_slice($argv, 1)), $_GET);

Which would handle a call such as:

php script.php item1=4 item2=300

By sending it into $_GET you automatically handle web or CLI access.

For commentary, this is doing the following:

  • If the count of arguments is greater than one (as first item is the name of the script) then proceed
  • Grab the arguments array excluding first item
  • Turn it into a standard query string format with ampersands
  • use parse_str to extract to the $_GET array
Iconoclasm answered 6/7, 2013 at 15:19 Comment(0)
A
16

While the answer is correct and you could do the parsing by hand, PHP also offers the getopt() function that might actually provide useful here.

There's also object-oriented alternatives (written in PHP, available in a number of libraries) that might turn out to be what you need. Googling for "php getopt" will yield helpful results.

Alban answered 15/6, 2012 at 12:19 Comment(1)
You are right about getopt() being a better solution (because it is native in PHP), but it would be better to demonstrate your point by a working solution to the asked question here .. this would make a better answer, which will get more votes ;)Passant
C
8

you can send parameters as one argument then parse that argument like a $_GET array

C:\xampp\php\php.exe name.php "inputFirstName=Robby&LastName=John"

and in your PHP file

if (!empty($argv[1])) {
  parse_str($argv[1], $_GET);
}

you'll get arguments in $_GET array like usual

Conversazione answered 5/4, 2020 at 12:50 Comment(0)
F
5

The getopt() function is probably the most correct answer in the case of the question. Especially since it was made platform independent with PHP 5.3. In the particular case of this question and parsing multiple parameters, one way to leverage this function would be as follows:

$defaultValues = array("inputFirstName" => "");
$givenArguments = getopt("", array("inputFirstName:"));
$options = array_merge($defaultValues, $givenArguments);
$inputFirstName = $options['inputFirstName'];

The call to set $inputFirstName with the value "Robby" would be:

> php script.php --inputFirstName="Robby"

Explanation

Default values for all expected parameters are set in the $defaultValues array. Input sent through via command line arguments are collected by PHP's getopt function and stored by the $givenArguments. Note that the colon (:) at the end of the "inputFirstName:" string indicates that this is a required argument. Without a colon here, only the presence of the argument would be detected, not the actual value (more information in the PHP Manual). Merging these two arrays together on the third line results in array with all expected parameters being set with either default values or arguments provided from the command line/terminal if they are available.

Fabled answered 25/10, 2017 at 11:54 Comment(0)
H
1

I don't know if at the time this question has being asked what i going to answer to it was available but if you call php-cgi -f myfile.php var=something you can retrieved whit $var=$_GET['var']; from the command line then you don't have to change your code to call it from the web browser or the command line

Hartsock answered 28/3, 2021 at 19:5 Comment(0)
C
0

If you don't mind using a library, I suggest you take a look at The Console Component by Symfony.

It can be used to create command line applications and supports the use of Arguments & Options.

The documentation page contains a couple of excellent examples to get you started.

Of course under the hood it uses the same techniques as explained by vascowhite.

Convince answered 19/6, 2018 at 9:22 Comment(0)
H
0

your best hope is to use

exec("php -f php.file.php example=js.json > ech0");
echo file_get_contents("ech0");
unlink("ech0");

That's what I use in PipesJS

Haply answered 20/2, 2023 at 21:15 Comment(0)
A
-1

You can parse the user input on your program looking for specific strings such as -inputFirstName="x" (using regular expressions, for example) and then set the correct variable to x.

Ave answered 15/6, 2012 at 10:26 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.