Bu bir PHP komut dosyası için bir komut satırı argümanı olarak bir dizi geçmek mümkün mü?

7 Cevap php

Ben (POST, vs, komut satırı argümanlarını GET) gelen verileri alma ve depolamak için sorumlu bir PHP kütüphane muhafaza ediyorum. Ben sadece POST dizi değişkenleri alıp GET izin vermez bir hata düzeltildi ettik ve bu da komut satırı ile fırsatlar bölümü için geçerli olup olmadığını merak ediyorum.

PHP için bir komut satırı argümanı olarak bir dizi iletebilirsiniz?

7 Cevap

Doğrudan değil, komut satırında geçen tüm argümanlar dizeleri vardır, ama onların isimleri ile birlikte tüm değişkenleri geçmek için bir argüman olarak sorgu dizesi kullanabilirsiniz:

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

Açıkçası, hayır. Eğer çok uzun komut onu deserializes gibi, bir argüman olarak tefrika (ya PHP'nin serialize() ve unserialize() veya json kullanarak) dizi geçebileceği Ancak.

gibi bir şey

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

Ben bu ancak ideal sanmıyorum, ben size hitap çalıştığınız sorun ne olursa olsun mücadele farklı bir şekilde düşünüyorum öneririm.

Bir dize olarak diziyi kodlayan bazı yolu anlamaya ihtiyacımız var. Sonra bir komut satırı argümanı olarak PHP CLI bu dizeyi iletebilirsiniz ve daha sonra bu dizeyi deşifre.

Bunu dedi gibi komut satırına diziler ve diğer verileri geçmek için serialize kullanabilirsiniz.

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

Ve myScript.php in:

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

Aşağıdaki kod bloğu virgülle ayrılmış değerler kümesi olarak dizisi geçirerek onu yapacağım:

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

ÇIKIŞ:

php ./array_play.php 1,2,3

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

Aşağıdaki talimatlar kümesi aşağıdaki sonra böyle bir arama yapabilirsiniz:

phpcl yourscript.php _GET = '{"anahtarı1": "val1", "anahtar2": "val2"}'

Eğer komut çağrıldığını önce yürütmek için kodu gerekir bu çalışma almak için. Ben linux üzerinde bir bash kabuğunu kullanın ve benim Bashrc dosyasında ben php ini bayrağı auto_prepend_file (bu dosya php_include_path yerde olmalıdır) benim komut satırı önyükleme dosyasını yüklemek için komut satırı arayüzü ayarlayın.:

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

Bu komut satırından, her çağrı çağrı komut dosyasını çalıştırmadan önce bu dosyayı yürütmek anlamına gelir. auto_prepend_file Ben bir sistem düzeyinde benim son durum ve hata işleyicileri ayarlamak benim standart php.ini kullanabilirsiniz, sistem bootstrap için harika bir yoldur. Bu komut satırı auto_prepend_file ayarlama benim normal ayarını geçersiz kılar ve ben $ _GET veya $ _POST ayarlayabilirsiniz böylece sadece komut satırı argümanlarını işlemek için seçin. İşte Önlerine dosyasıdır:

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

Bu iletilen tüm argümanların yoluyla döngüler ve variable variables ($ $ not) kullanarak global değişkenler ayarlar. Kılavuz sayfası değişken değişkenler superglobals ile çalışmıyor demek gelmez, ama (ben çok POST ile çalışır tahmin ediyorum) $ _GET ile benim için iş gibi görünüyor. JSON olarak değerleri geçirmek için seçin. Json_decode dönüş değeri hata null olacak, bunu gerekirse kod okuma hata denetimini yapmalıdır.

Bu yüzden, bir CLI gibi ise,

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

Sonra fonksiyonu şu bu olabilir okur

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

Bu size verecek

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