2010-05-20 13 views
19

Ich führe eine PHP-Bibliothek, die für das Abrufen und Speichern eingehender Daten verantwortlich ist (POST, GET, Befehlszeilenargumente usw.). Ich habe gerade einen Fehler behoben, der es nicht erlauben würde, Array-Variablen von POST und GET abzurufen, und ich frage mich, ob dies auch für den Teil gilt, der die Befehlszeile behandelt.Ist es möglich, ein Array als Befehlszeilenargument an ein PHP-Skript zu übergeben?

Können Sie ein Array als Befehlszeilenargument an PHP übergeben?

Antwort

9

Direkt nicht, alle Argumente in der Kommandozeile übergeben werden Strings, aber können Sie Query-String als Argument verwenden, um alle Variablen mit ihren Namen übergeben:

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

Genau genommen, nein. Sie können jedoch ein serialisiertes Array übergeben (entweder mit dem und unserialize() PHP-Array oder mit json) Array als Argument, solange das Skript es deserialisiert.

so etwas wie

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

Ich denke nicht, dies aber ideal ist, würde ich Sie denken, eine andere Art und Weise legen nahe, zur Bewältigung was Problem, das Sie ansprechen versuchen.

+2

Es ist 'unserialize()' nicht 'deserialize()' –

+0

@ dev-null-dweller, danke - geändert. –

+1

unserialize() ist unsicher und sollte daher nicht empfohlen werden. –

1

Sie müssen herausfinden, wie Sie Ihr Array als String codieren können. Dann können Sie diese Zeichenfolge als Befehlszeilenargument an PHP CLI übergeben und diese Zeichenfolge später dekodieren.

1

Nachdem Sie den Satz von Anweisungen unten Sie machen können ein Aufruf wie folgt:

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

um dies zu erhalten Sie, bevor Sie das Skript ausführen müssen Code arbeiten gerufen werden. Ich benutze eine Bash-Shell auf Linux und in meinem .bashrc stelle ich die Befehlszeilenschnittstelle der php.ini-Flag auto_prepend_file laden meine Befehlszeile Bootstrap-Datei zu machen (diese Datei sollte irgendwo in Ihrem php_include_path gefunden):

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

Dies bedeutet, dass bei jedem Aufruf von der Befehlszeile diese Datei ausgeführt wird, bevor das von Ihnen aufgerufene Skript ausgeführt wird. auto_prepend_file ist eine großartige Möglichkeit, Ihr System zu starten, ich benutze es in meiner Standard-php.ini, um meine letzten Ausnahmen und Fehlerbehandlungsroutinen auf Systemebene zu setzen. Die Einstellung dieser Befehlszeile auto_prepend_file überschreibt meine normale Einstellung und ich wähle nur Befehlszeilenargumente, so dass ich $ _GET oder $ _POST setzen kann. Hier ist die Datei, die ich voranstellen:

<?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); 
} 
?> 

Es Schleifen durch alle Argumente übergeben und setzt globale Variablen variable variables (beachten Sie die $$). Die Handbuchseite sagt zwar, dass Variablenvariablen nicht mit Superglobalen funktionieren, aber es scheint für mich mit $ _GET zu funktionieren (ich vermute, dass es auch mit POST funktioniert). Ich übertrage die Werte als JSON. Der Rückgabewert von json_decode ist bei einem Fehler NULL. Sie sollten eine Fehlerüberprüfung bei der Dekodierung durchführen, wenn Sie sie benötigen.

6

Wie gesagt wurde, können Sie serialize verwenden, um Arrays und andere Daten an die Befehlszeile zu übergeben.

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

Und in MyScript.PHP: So

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

wenn ein CLI ist als solche

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

Dann ist die Funktion, das ist das liest

function getArguments($args){ 
    unset($args[0]); //remove the path to script variable 
    $string = implode('&',$args); 
    parse_str($string, $params); 
    return $params; 
} 
sein können Dies würde Ihnen

Array 
(
    [param1] => no array 
    [param2] => Array 
      (
       [0] => is array 
       [1] => of two 
      ) 
) 
3

Die Der folgende Codeblock wird das Array übergeben S eine Menge von durch Kommas getrennte Werte:

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

OUTPUT:

php ./array_play.php 1,2,3 

array(3) { 
    [0]=> 
    string(1) "1" 
    [1]=> 
    string(1) "2" 
    [2]=> 
    string(1) "3" 
} 
0

Sort of.

Wenn Sie so etwas wie dies passieren:

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

Sie erhalten diese in der opt1 Argument:

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

so können Sie konvertieren, dass diese Schnipsel mit:

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

die macht es zu diesem:

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

Das geht nicht gut, wenn ein Wert einen Doppelpunkt (':') enthält. –

1

Im Fall, wenn Sie Befehlszeilen-Skript mit Argumenten durch die Ausführung von Code werden dann das Beste, was zu Basis kodieren sie -

base64_encode(json_encode($arr)); 

beim Senden und entschlüsseln, während in anderen Skript zu empfangen.

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

Das wird auch die Frage der json ohne Anführungszeichen um den Schlüssel und Werte empfangen lösen. Denn ohne Anführungszeichen wird es als bad json angesehen und Sie werden nicht in der Lage sein, das zu decodieren.

Verwandte Themen