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.