Можно ли передать массив в качестве аргумента командной строки в сценарий PHP? - PullRequest
21 голосов
/ 20 мая 2010

Я поддерживаю библиотеку PHP, которая отвечает за выборку и хранение входящих данных (POST, GET, аргументы командной строки и т. Д.). Я только что исправил ошибку, которая не позволяла ему извлекать переменные массива из POST и GET, и мне интересно, применимо ли это также к части, которая имеет дело с командной строкой.

Можете ли вы передать массив в качестве аргумента командной строки в PHP?

Ответы [ 9 ]

13 голосов
/ 20 мая 2010

Непосредственно нет, все аргументы, передаваемые в командной строке, являются строками, но вы можете использовать строку запроса в качестве одного аргумента для передачи всех переменных с их именами:

php myscript.php a[]=1&a[]=2.2&a[b]=c

<?php
parse_str($argv[1]);
var_dump($a);
?>

/*
array(3) {
  [0]=> string(1) "1"
  [1]=> string(3) "2.2"
  ["b"]=>string(1) "c"
}
*/
10 голосов
/ 20 мая 2010

Строго говоря, нет. Однако вы можете передать в качестве аргумента сериализованный (с использованием PHP serialize() и unserialize() или с помощью json) массив, если сценарий десериализует его.

что-то вроде

php MyScript.php "{'colors':{'red','blue','yellow'},'fruits':{'apple','pear','banana'}}"

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

7 голосов
/ 28 сентября 2011

Как уже было сказано, вы можете использовать serialize для передачи массивов и других данных в командную строку.

shell_exec('php myScript.php '.escapeshellarg(serialize($myArray)));

И в myScript.php:

$myArray = unserialize($argv[1]);
3 голосов
/ 31 октября 2017

В случае, если вы выполняете сценарий командной строки с аргументами через код, тогда лучше всего закодировать его -

base64_encode(json_encode($arr));

при отправке и декодировании при получении другим скриптом.

json_decode(base64_decode($argv[1]));

Это также решит проблему получения json без кавычек вокруг ключей и значений. Потому что без кавычек он считается bad json , и вы не сможете его расшифровать.

3 голосов
/ 24 сентября 2013

Следующий блок кода сделает это, передав массив в виде набора значений, разделенных запятыми:

<?php
  $i_array = explode(',',$argv[1]);
  var_dump($i_array);
?>

ВЫВОД:

php ./array_play.php 1,2,3

array(3) {
  [0]=>
  string(1) "1"
  [1]=>
  string(1) "2"
  [2]=>
  string(1) "3"
}
1 голос
/ 05 мая 2014

Сортировка.

Если вы передадите что-то вроде этого:

$php script.php --opt1={'element1':'value1','element2':'value2'}

Вы получаете это в аргументе opt1:

Array(
 [0] => 'element1:value1'
 [1] => 'element2:value2'
)

, чтобы вы могли преобразовать это, используя этот фрагмент:

foreach($opt1 as $element){
    $element = explode(':', $element);
    $real_opt1[$element[0]] = $element[1];
}

что превращает это в это:

Array(
 [element1] => 'value1'
 [element2] => 'value2'
)
1 голос
/ 14 июня 2011

После выполнения приведенных ниже инструкций вы можете позвонить так:

phpcl yourscript.php _GET = '{"key1": "val1", "key2": "val2"}'

Чтобы это работало, вам нужно выполнить код перед вызовом скрипта. Я использую оболочку bash в linux и в своем файле .bashrc я установил интерфейс командной строки, чтобы заставить php ini flag auto_prepend_file загружать мой файл начальной загрузки командной строки (этот файл должен быть найден где-то в вашем php_include_path):

alias phpcl='php -d auto_prepend_file="system/bootstrap/command_line.php"'

Это означает, что каждый вызов из командной строки будет выполнять этот файл перед запуском вызываемого вами скрипта. auto_prepend_file - отличный способ загрузить вашу систему, я использую его в своем стандартном php.ini, чтобы установить мои окончательные обработчики исключений и ошибок на системном уровне. Установка этой командной строки auto_prepend_file переопределяет мои обычные настройки, и я выбираю просто обрабатывать аргументы командной строки, чтобы можно было установить $ _GET или $ _POST. Вот файл, который я добавляю:

<?php
// Parse the variables given to a command line script as Query Strings of JSON.
// Variables can be passed as separate arguments or as part of a query string:
//    _GET='{ "key1": "val1", "key2": "val2" }' foo='"bar"'
// OR
//    _GET='{ "key1": "val1", "key2": "val2" }'\&foo='"bar"' 
if ($argc > 1)
{
   $parsedArgs = array(); 

   for ($i = 1; $i < $argc; $i++)
   {
      parse_str($argv[$i], $parsedArgs[$i]);
   }

   foreach ($parsedArgs as $arg)
   {
      foreach ($arg as $key => $val)
      {
         // Set the global variable of name $key to the json decoded value.
         $$key = json_decode($val, true);
      }
   }

   unset($parsedArgs);
}
?>

Он перебирает все передаваемые аргументы и устанавливает глобальные переменные, используя переменные переменные (обратите внимание на $$). На странице руководства написано, что переменные переменные не работают с суперглобальными переменными, но, похоже, у меня работает с $ _GET (полагаю, это работает и с POST). Я хочу передать значения в формате JSON. Возвращаемое значение json_decode будет NULL в случае ошибки, вы должны выполнить проверку ошибок при декодировании, если вам это нужно.

1 голос
/ 20 мая 2010

Вам нужно найти способ кодирования массива в виде строки. Затем вы можете передать эту строку в PHP CLI в качестве аргумента командной строки, а затем декодировать эту строку.

0 голосов
/ 25 июля 2013

Так что, если CLI как таковой

php path\to\script.php param1=no+array param2[]=is+array param2[]=of+two

Тогда функция, которая читает это, может быть

function getArguments($args){
    unset($args[0]); //remove the path to script variable
    $string = implode('&',$args);
    parse_str($string, $params);
    return $params;
}

Это даст вам

Array
(
    [param1] => no array
    [param2] => Array
             (
                 [0] => is array
                 [1] => of two
             )
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...