PHP, linux komut isteminde $ _GET'i geçiyor


125

Genellikle şu yolla eriştiğimizi varsayalım:

http://localhost/index.php?a=1&b=2&c=3

Aynı şeyi linux komut isteminde nasıl çalıştırırız?

php -e index.php

Peki ya $ _GET değişkenlerini geçirmeye ne dersiniz? Belki php -e index.php –a 1 –b 2 –c 3 gibi bir şey? Bunun işe yarayacağından şüphe.

Teşekkür ederim!

Yanıtlar:


122

Tipik olarak, bir komut satırı komut dosyasına argümanlar iletmek için ya argvglobal değişken ya da getopt kullanacaksınız :

// bash command:
//   php -e myscript.php hello
echo $argv[1]; // prints hello

// bash command:
//   php -e myscript.php -f=world
$opts = getopt('f:');
echo $opts['f']; // prints world

$ _GET, doldurmak için bir web sunucusu gerektirdiğinden komut satırında bulunmayan HTTP GET yöntemi parametrelerini ifade eder.

Yine de $ _GET'i gerçekten doldurmak istiyorsanız, bunu yapabilirsiniz:

// bash command:
//   export QUERY_STRING="var=value&arg=value" ; php -e myscript.php
parse_str($_SERVER['QUERY_STRING'], $_GET);
print_r($_GET);
/* outputs:
     Array(
        [var] => value
        [arg] => value
     )
*/

Ayrıca, belirli bir betiği çalıştırabilir, $_GETsöz konusu komut dosyasını değiştirmeden komut satırından doldurabilirsiniz :

export QUERY_STRING="var=value&arg=value" ; \
php -e -r 'parse_str($_SERVER["QUERY_STRING"], $_GET); include "index.php";'

Aynısını $_POSTve ile de yapabileceğinizi unutmayın $_COOKIE.


1
PHP 5.3 çalıştıran Centos 6 makinemizde çağrının yerine php [script name] "a=1&b=2&c=3"geçmeyeceğini $_SERVER['QUERY_STRING'], ancak aynı şeyi referans vererek kolayca etkileyebileceğinizi belirtmek gerekir $_SERVER['argv'][1].
Eric L.

4
PHP komut dosyasını değiştirmeden komut satırından sorgu dizesini doldurmak için bu yanıtı deneyin .
qris

Bu en iyi cevap değil. Bu sayfadaki diğer yanıta bakın: stackoverflow.com/a/11965479/543738
LS

Faydalı cevap, eğer benim gibi bu iki nokta üst üste işaretlerinin argüman adlarından sonra ne olduğunu merak ediyorsanız getopt(), bu görünüşe göre PHP'ye seçeneği değil (iki nokta üst üste belirtilir) argümanı istediğinizi söyler . Yani bu sadece sözdizimi. f f
Mitya

Son cevabı gerçekten beğendim ve dün kullandım. Bir senaryoya da dönüştürülebilir.
reinierpost

239

ServerFault üzerindeki bu yanıttan :

Kullanım php-cgiyerine ait ikili phpve bunun gibi, komut satırında argüman pass:

php-cgi -f index.php left=1058 right=1067 class=A language=English

Bu da şunu ifade eder $_GET:

Array
(
    [left] => 1058
    [right] => 1067
    [class] => A
    [language] => English
)

Ayrıca web sunucusu tarafından ayarlanacak ortam değişkenlerini şu şekilde ayarlayabilirsiniz:

REQUEST_URI='/index.php' SCRIPT_NAME='/index.php' php-cgi -f index.php left=1058 right=1067 class=A language=English

10
+1 ve +1: Bu yanıt, kabul edilen yanıt olmalıydı. Çok daha az güçlük! Php kaynağını değiştirmeye gerek yok.
micha

2
Mükemmel, bu, işletim sistemine bağlı herhangi bir betiğe kolayca sarılabilir.
Sebastian

2
+1, harika bir çözüm, bunu desteklemek için şu anda tüm CLI komut dosyalarımı
arka plana atıyorum

Şimdiye kadar gördüğüm tek dezavantaj, terminal çıktısının sadece \ n yerine <br /> ile HTML olmasıdır. Bu, tüm bildirimler ve hatalar için de geçerlidir, örneğin<b>Notice</b>: Undefined index: testing in <b> ... </b><br />
bafromca

+1 Harika, Bu Normal Komut Dosyasında çalışıyor $ _GET Value For Ex as: php-cgi -f /var/www/vhosts/example.com/public_html/index.php action=DoSomething Çalışıyor İyi ..
Ajmal Praveen

16

Ubuntu'da php-cgi ikili programım yok, bu yüzden şunu yaptım:

% alias php-cgi = "php -r '"' parse_str (implode ("&", array_slice ($ argv, 2)), $ _GET); dahil ($ argv [1]); '"' -"
% php-cgi test1.php foo = 123
<Html>
Foo'yu 123 olarak ayarladınız.
</ Html>

% cat test1.php
<html> foo 'yu <? php print $ _GET [' foo ']?> olarak ayarladınız. </html>

Personeli düzeltmenin bir php yolu gibi görünüyor.
FelikZ

14

Bazen, $ _GET'i iletilen parametrelere ayarlamak için php dosyasını düzenleme seçeneğiniz yoktur ve bazen php-cgi'yi yükleyemezsiniz veya kurmak istemezsiniz.

Bunu, bu durum için en iyi çözüm olarak buldum:

php -r '$_GET["key"]="value"; require_once("script.php");' 

Bu, php dosyanızı değiştirmekten kaçınır ve düz php komutunu kullanmanıza izin verir. Eğer php-cgi'yi kurduysanız, kesinlikle onu kullanın, ama bu sonraki en iyi şeydir. Bu seçeneklerin bahsetmeye değer olduğunu düşündüm

-r, aşağıdaki dizede php kodunu çalıştırmak anlamına gelir. $ _GET değerini burada manuel olarak ayarlarsınız ve ardından çalıştırmak istediğiniz dosyaya başvurursunuz.

Bunu doğru klasörde çalıştırmanız gerektiğini, ancak her zaman php dosyasının bulunduğu klasörde çalıştırmamanız gerektiğini belirtmek gerekir. Gereken ifadeler, dosyanın konumunu DEĞİL, göreceli URL'leri çözmek için komutunuzun konumunu kullanacaktır.


1
Bu çözüm için size teşekkür etmek istiyorum. Bence bu kabul edilen cevap olmalıdır. Kullanmak için fazladan bir kitaplık kurmanız gerekmez.
swordsecurity

Bu, kabul edilen cevaptan çok daha iyi. Sizin için oy verin!
faraday703

harika ve kolay çözüm!
derRobert

Harika cevap. Kodunuzda sadece bir son alıntı eksik :)
Pedro Araujo Jorge

10
php file_name.php var1 var2 varN

Sonra $_GETdeğişkenlerinizi PHP'de ilk satırınıza ayarlayın , ancak bu bir $_GETdeğişken ayarlamak için istenen yol olmasa da daha sonra bu değişkenle ne yaptığınıza bağlı olarak sorunlar yaşayabilirsiniz.

if (isset($argv[1])) {
   $_GET['variable_name'] = $argv[1];
}

komut dosyasını çalıştırdığınız değişkenlere $argvPHP uygulamanızdaki diziden erişilebilir . ilk giriş, geldikleri betiğin adı olacaktır, bu nedenle, array_shift($argv)bir grup değişkeni işlemek istiyorsanız, o ilk girişi iptal etmek isteyebilirsiniz. Ya da sadece yerel bir değişkene yükleyin.


en kolay ve daha basit çözüm
João Pimentel Ferreira

9

Şunları kullanmayı deneyin WGET:

WGET 'http://localhost/index.php?a=1&b=2&c=3'

1
URL'yi tek tırnak içine almak istersiniz,? ve sorgu kısmındaki &, kabuk meta karakterlerdir (tek karakter joker karakteri + "bu komutu arka planda çalıştır").
Marc B

7
Bu işe yarayacak, ancak çalışan bir web sunucusu gerektirir ve tüm süreci gerekenden biraz daha verimsiz hale getirir.
Brad

Olur, ancak tipik olarak $_GETçalışan bir web sunucusu anlamına gelir.
hızlı değiştirme

6

- Seçenek 1: php-cgi -

Komut dosyanızı çalıştırmak için 'php' yerine 'php-cgi' kullanın. Bu, php kodunuzu onunla çalışmak için özel olarak değiştirmeniz gerekmeyeceği için en basit yoldur:

php-cgi -f /my/script/file.php a=1 b=2 c=3

- Seçenek 2: bir web sunucunuz varsa -

Php dosyası bir web sunucusundaysa, komut satırında 'wget' kullanabilirsiniz:

wget 'http://localhost/my/script/file.php?a=1&b=2&c=3'

VEYA:

wget -q -O - "http://localhost/my/script/file.php?a=1&b=2&c=3"

- Değişkenlere php'de erişmek -

Her iki seçenek 1 ve 2'de de şu parametrelere erişirsiniz:

$a = $_GET["a"];
$b = $_GET["b"];
$c = $_GET["c"];

2

Eğer geçmek gerekirse $_GET, $_REQUEST, $_POSTveya başka bir şey de PHP interaktif modunu kullanabilirsiniz:

php -a

Ardından şunu yazın:

<?php
$_GET['a']=1;
$_POST['b']=2;
include("/somefolder/some_file_path.php");

Bu, istediğiniz değişkenleri manuel olarak ayarlayacak ve ardından php dosyanızı bu değişkenler kümesiyle çalıştıracaktır.


1

PHP komut dosyasını düzenleme olanağınız varsa, komut dosyasının başlangıcındaki aşağıdaki kodu kullanarak $ _GET dizisini yapay olarak doldurabilir ve ardından komut dosyasını sözdizimi ile çağırabilirsiniz: php -f script.php name1=value1 name2=value2

// When invoking the script via CLI like "php -f script.php name1=value1 name2=value2", this code will populate $_GET variables called "name1" and "name2", so a script designed to be called by a web server will work even when called by CLI
if (php_sapi_name() == "cli") {
    for ($c = 1; $c < $argc; $c++) {
        $param = explode("=", $argv[$c], 2);
        $_GET[$param[0]] = $param[1]; // $_GET['name1'] = 'value1'
    }
}

1

Komut satırına aşağıdakileri yapıştırın

export QUERY_STRING="param1=abc&param2=xyz" ;  
POST_STRING="name=John&lastname=Doe" ; php -e -r 
'parse_str($_SERVER["QUERY_STRING"], $_GET); parse_str($_SERVER["POST_STRING"], 
$_POST);  include "index.php";'

0

Onları şu şekilde geçiyorum:

php5 script.php param1=blabla param2=yadayada

gayet iyi çalışıyor, $ _GET dizisi:

array(3) {
  ["script_php"]=>
  string(0) ""
  ["param1"]=>
  string(6) "blabla"
  ["param2"]=>
  string(8) "yadayada"
}

bunun barındırma sunucumda çalıştığını, ancak yerel sunucumda çalışmadığını öğrendim, acayip.
Asaf

Belki kurulu sürümde bir fark var? Bu sizin için hangi sürümde çalıştı ve hangisi başarısız oldu?
Kzqai

barındırma üzerinde php 5.2, çalışıyor, 5.3 yerel olarak değil ... önemli değil $ _GET'in boş olması durumunda $ argv yolunu yaptım
Asaf

-1

php -r 'parse_str($argv[2],$_GET);include $argv[1];' index.php 'a=1&b=2'

İlk bölümü bir takma ad olarak yapabilirsiniz:

alias php-get='php -r '\''parse_str($argv[2],$_GET);include $argv[1];'\'

sonra basitçe şunu kullanın:

php-get some_script.php 'a=1&b=2&c=3'


-2

veya sadece (LYNX'iniz varsa):

lynx 'http://localhost/index.php?a=1&b=2&c=3'

3
Bu, PHP'yi komut satırından çalıştırmaz. Bu, web sunucusunu komut satırı üzerinden çağıran bir tarayıcı çalıştırır.
Andrea Lazzarotto
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.