Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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"
}
*/

Ответ 2

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

что-то вроде

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

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

Ответ 3

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

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

И в myScript.php:

$myArray = unserialize($argv[1]);

Ответ 4

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

<?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"
}

Ответ 5

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

Ответ 6

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

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

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

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

Это означает, что каждый вызов из командной строки будет выполнять этот файл перед запуском script, который вы вызываете. 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 при ошибке, вы должны выполнить проверку ошибок на декоде, если вам это нужно.

Ответ 7

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

base64_encode(json_encode($arr));

при отправке и декодировании при приеме в другом script.

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

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

Ответ 8

Итак, если 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
             )
)

Ответ 9

Сортировка.

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

$PHP скрипт.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'
)