Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP, pass parameters from command line to a PHP script

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?

like image 432
125369 Avatar asked Jun 15 '12 10:06

125369


People also ask

Can we use PHP for command line scripts?

As of version 4.3. 0, PHP supports a new SAPI type (Server Application Programming Interface) named CLI which means Command Line Interface. As the name implies, this SAPI type main focus is on developing shell (or desktop as well) applications with PHP.

What is $argv in PHP?

Introduction. When a PHP script is run from command line, $argv superglobal array contains arguments passed to it. First element in array $argv[0] is always the name of script. This variable is not available if register_argc_argv directive in php. ini is disabled.

What does $_ GET do in PHP?

PHP $_GET is a PHP super global variable which is used to collect form data after submitting an HTML form with method="get". $_GET can also collect data sent in the URL. When a user clicks on the link "Test $GET", the parameters "subject" and "web" are sent to "test_get.


2 Answers

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.

like image 139
vascowhite Avatar answered Sep 22 '22 23:09

vascowhite


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) the 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
like image 21
NickM Avatar answered Sep 23 '22 23:09

NickM