PHP, передать параметры из командной строки в php-скрипт

Я хочу передать параметры из интерфейса командной строки PHP, а затем прочитать значения с помощью скрипта PHP, что-то вроде этого:

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

Я передаю переменную из CLI следующим образом:

C:xamppphpphp.exe name.php Robby

выше работает, я получаю Робби в качестве выходного.

но я хочу сделать что-то вроде этого:

C:xamppphpphp.exe name.php -inputFirstName="Robby"

Так, что потребитель будет хорошо информирован для того чтобы вписать правильные параметры в правильные места. Каков подходящий способ разбора этих параметры?

6 ответов


при вызове PHP-скрипта из командной строки вы можете использовать $argc, чтобы узнать, сколько параметров передается и $argv для доступа к ним. Например, выполняется следующий скрипт:

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

такой:-

php script.php arg1 arg2 arg3

выдаст следующий вывод

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

посмотреть $argv в и $argc для получения дополнительной информации.

чтобы сделать то, что вы хотите, давайте скажем

php script.php arg1=4

вам нужно было бы взорвать аргумент о знаке равенства: -

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

таким образом, вы можете иметь все, что хотите, перед знаком равенства, не разбирая его, просто проверьте правильность пар ключ=>значение. Однако это все немного расточительно, просто проинструктируйте пользователя о правильном порядке передачи аргументов.


в то время как ответ правильный, и вы можете сделать разбор вручную, PHP также предлагает getopt() функция, которая может быть полезна здесь.

есть также объектно-ориентированные альтернативы (написанные на PHP, доступные в ряде библиотек), которые могут оказаться тем, что вам нужно. Googling для "php getopt" даст полезные результаты.


Я использую этот довольно лаконичный способ:

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

который будет обрабатывать вызов, такой как:

php script.php item1=4 item2=300

отправив его в $_GET, вы автоматически обрабатываете доступ к сети или CLI.

для комментариев, это делает следующее:

  • если количество аргументов больше одного (так как первый элемент-это имя скрипта), то продолжить
  • захватите массив аргументов, исключая первый элемент
  • поверните его в стандарт формат строки запроса с амперсандами
  • используйте parse_str для извлечения в массив $_GET

The getopt() функция, вероятно, является наиболее правильным ответом в случае вопроса. Тем более, что он был сделан независимым от платформы с PHP 5.3. В частном случае этого вопроса и разбора нескольких параметров один из способов использования этой функции будет следующим:

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

вызов для установки $inputFirstName со значением "Robby" будет:

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

объяснение

значения по умолчанию для всех ожидаемых параметров в $defaultValues массив. Входные данные, отправленные через аргументы командной строки, собираются PHP getopt функция и хранится в $givenArguments. Обратите внимание, что двоеточие (:) в конце "inputFirstName:" string указывает, что это обязательный аргумент. Без двоеточия здесь будет обнаружено только наличие аргумента, а не фактическое значение (дополнительная информация в руководстве по PHP). Объединение этих двух массивов вместе на третьей строке приводит к массиву со всеми ожидаемыми параметры устанавливаются со значениями по умолчанию или аргументами, предоставленными из командной строки/терминала, если они доступны.


Если вы не возражаете, используя библиотеку, я предлагаю вам взглянуть на консольный компонент от Symfony.

Он может использоваться для создания приложений командной строки и поддерживает использование Аргументы И Варианты.

страница документации содержит пару отличных примеров, чтобы вы начали.

конечно, под капотом он использует те же методы, что и vascowhite.


вы можете проанализировать пользовательский ввод в вашей программе, ища определенные строки, такие как -inputFirstName="x" (используя регулярные выражения, например), а затем установите правильную переменную в x.