PHP przekazuje $ _GET w linii poleceń Linuksa

125

Powiedzmy, że zwykle uzyskujemy dostęp przez

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

Jak wykonać to samo w wierszu poleceń Linuksa?

php -e index.php

Ale co z przekazywaniem zmiennych $ _GET? Może coś takiego jak php -e index.php --a 1 --b 2 --c 3? Wątpię, że to zadziała.

Dziękuję Ci!

Patrick
źródło

Odpowiedzi:

122

Zwykle, aby przekazać argumenty do skryptu wiersza poleceń, będziesz używać argvzmiennej globalnej lub getopt :

// 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 odnosi się do parametrów metody HTTP GET, które są niedostępne w wierszu poleceń, ponieważ wymagają wypełnienia serwera WWW.

Jeśli i tak naprawdę chcesz wypełnić $ _GET, możesz to zrobić:

// 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
     )
*/

Możesz także wykonać dany skrypt, wypełnić go $_GETz linii poleceń, bez konieczności jego modyfikowania:

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

Pamiętaj, że możesz zrobić to samo z $_POSTi $_COOKIE.

netcoder
źródło
1
Warto zauważyć, że na naszej maszynie Centos 6 z PHP 5.3 wywołanie php [script name] "a=1&b=2&c=3"nie zapełni pola $_SERVER['QUERY_STRING'], ale możesz łatwo wpłynąć na to samo, odwołując się $_SERVER['argv'][1].
Eric L.
4
Wypróbuj tę odpowiedź, aby wypełnić ciąg zapytania z wiersza poleceń bez modyfikowania skryptu PHP.
qris
To nie jest najlepsza odpowiedź. Zobacz tę inną odpowiedź na tej stronie: stackoverflow.com/a/11965479/543738
LS
Pomocna odpowiedź, chociaż jeśli tak jak ja zastanawiasz się, jakie są te dwukropki po nazwach argumentów w getopt(), to najwyraźniej mówi PHP, że chcesz argument f , a nie opcję f (która byłaby określona bez dwukropka). Więc to tylko składnia.
Mitya,
Bardzo podoba mi się ostatnia odpowiedź i skorzystałem z niej wczoraj. Można go również przekształcić w skrypt.
reinierpost
239

Z tej odpowiedzi w ServerFault :

Użyj php-cgipliku binarnego zamiast po prostu phpi przekaż argumenty w wierszu poleceń, na przykład:

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

Który umieszcza to w $_GET:

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

Możesz także ustawić zmienne środowiskowe, które zostałyby ustawione przez serwer WWW, na przykład:

REQUEST_URI='/index.php' SCRIPT_NAME='/index.php' php-cgi -f index.php left=1058 right=1067 class=A language=English
qris
źródło
10
+1 i +1: ta odpowiedź powinna być zaakceptowaną odpowiedzią. Dużo mniej kłopotów! Nie ma potrzeby zmiany źródła php.
micha
2
Doskonale, można to łatwo umieścić w dowolnym skrypcie zależnym od systemu operacyjnego.
Sebastian,
2
+1, świetne rozwiązanie, obecnie przenoszę wszystkie moje skrypty CLI do obsługi tego teraz;)
ehime
Jedynym minusem, jaki do tej pory widziałem, jest to, że wyjście terminala to HTML z <br />, a nie tylko \ n. Dotyczy to również wszystkich zawiadomień i błędów, np.<b>Notice</b>: Undefined index: testing in <b> ... </b><br />
bafromca
+1 Niesamowite, to działa w normalnym skrypcie $ _GET Wartość dla Ex jako: php-cgi -f /var/www/vhosts/example.com/public_html/index.php action=DoSomething Działa dobrze ..
Ajmal Praveen
16

Nie mam pliku binarnego php-cgi na Ubuntu, więc zrobiłem to:

% alias php-cgi = "php -r '"' parse_str (implode ("&", array_slice ($ argv, 2)), $ _GET); include ($ argv [1]); '"' -"
% php-cgi test1.php foo = 123
<html>
Ustawiłeś foo na 123.
</html>

% cat test1.php
<html> Ustawiłeś foo na <? php print $ _GET ['foo']?>. </html>
Tim Booth
źródło
Wygląda na sposób php do naprawiania personelu.
FelikZ
14

Czasami nie masz możliwości edycji pliku php, aby ustawić $ _GET na przekazane parametry, a czasami nie możesz lub nie chcesz zainstalować php-cgi.

Uważam, że jest to najlepsze rozwiązanie w tym przypadku:

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

Pozwala to uniknąć zmiany pliku php i umożliwia użycie zwykłego polecenia php. Jeśli masz zainstalowane php-cgi, użyj go, ale to jest kolejna najlepsza rzecz. Uważałem, że warto wspomnieć o tej opcji

-r oznacza uruchomienie kodu php w następującym ciągu. ręcznie ustawiasz tam wartość $ _GET, a następnie odwołujesz się do pliku, który chcesz uruchomić.

Warto zauważyć, że powinieneś uruchomić to w odpowiednim folderze, często, ale nie zawsze, w folderze, w którym znajduje się plik php. Wymaga instrukcji użyje lokalizacji twojego polecenia do rozpoznania względnych adresów URL, a NIE lokalizacji pliku

derrick biały
źródło
1
Dziękuję za to rozwiązanie. Moim zdaniem powinna to być akceptowana odpowiedź. Nie musisz instalować dodatkowej biblioteki, aby z niej korzystać.
Swordsecurity
To o wiele lepsze niż zaakceptowana odpowiedź. Głosuj za Ciebie!
faraday703
świetne i łatwe rozwiązanie!
derRobert
Świetna odpowiedź. W swoim kodzie brakuje tylko końcowego cytatu :)
Pedro Araujo Jorge
10
php file_name.php var1 var2 varN

Następnie ustaw $_GETzmienne w pierwszej linii w PHP, chociaż nie jest to pożądany sposób ustawiania $_GETzmiennej i możesz napotkać problemy w zależności od tego, co zrobisz później z tą zmienną.

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

zmienne, za pomocą których uruchamiasz skrypt, będą dostępne z $argvtablicy w Twojej aplikacji PHP. pierwszy wpis będzie nazwą skryptu, z którego pochodzi, więc możesz zechcieć array_shift($argv)usunąć ten pierwszy wpis, jeśli chcesz przetworzyć kilka zmiennych. Lub po prostu załaduj do zmiennej lokalnej.

T. Brian Jones
źródło
najłatwiejsze i prostsze rozwiązanie
João Pimentel Ferreira
9

Spróbuj użyć WGET:

WGET 'http://localhost/index.php?a=1&b=2&c=3'
Giuseppe Accaputo
źródło
1
Chcesz ująć adres URL w pojedyncze cudzysłowy, jako? a & w części zapytania to metaznaki powłoki (pojedynczy znak wieloznaczny + „uruchom to polecenie w tle”).
Marc B
7
To zadziała, ale wymaga działającego serwera internetowego i sprawia, że ​​cały proces jest odrobinę mniej wydajny niż jest to wymagane.
Brad
Tak, ale zazwyczaj $_GEToznacza to działający serwer WWW.
quickshiftin
6

- Opcja 1: php-cgi -

Aby uruchomić skrypt, użyj „php-cgi” zamiast „php”. To najprostszy sposób, ponieważ nie będziesz musiał specjalnie modyfikować kodu php, aby z nim pracować:

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

- Opcja 2: jeśli masz serwer WWW -

Jeśli plik php znajduje się na serwerze WWW, możesz użyć „wget” w wierszu poleceń:

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

LUB:

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

- Dostęp do zmiennych w php -

W obu opcji 1 i 2 uzyskujesz dostęp do tych parametrów w następujący sposób:

$a = $_GET["a"];
$b = $_GET["b"];
$c = $_GET["c"];
Bastion
źródło
2

Jeśli trzeba przejść $_GET, $_REQUEST, $_POST, lub cokolwiek innego, co może również skorzystać z trybu interaktywnego PHP:

php -a

Następnie wpisz:

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

Spowoduje to ręczne ustawienie dowolnych zmiennych, które chcesz, a następnie uruchomienie pliku php z ustawionymi tymi zmiennymi.

makman99
źródło
1

Jeśli masz możliwość edycji skryptu PHP, możesz sztucznie wypełnić tablicę $ _GET za pomocą następującego kodu na początku skryptu, a następnie wywołać skrypt ze składnią: 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'
    }
}
lucaferrario
źródło
1

W wierszu poleceń wklej następujące elementy

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";'
Jimmy Moran
źródło
0

Po prostu mijam je w ten sposób:

php5 script.php param1=blabla param2=yadayada

działa dobrze, tablica $ _GET to:

array(3) {
  ["script_php"]=>
  string(0) ""
  ["param1"]=>
  string(6) "blabla"
  ["param2"]=>
  string(8) "yadayada"
}
Asaf
źródło
właśnie dowiedziałem się, że to działa na moim serwerze hostingowym, ale nie na moim serwerze lokalnym, dziwaku.
Asaf
Może różnica w zainstalowanej wersji? W której wersji ta wersja zadziałała, a która się nie powiodła?
Kzqai
php 5.2 na hostingu, działa, 5.3 lokalnie nie ma znaczenia ... nie ma znaczenia Zrobiłem to w sposób $ argv na wypadek, gdyby $ _GET było puste
Asaf
-1

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

Możesz zrobić pierwszą część jako alias:

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

następnie po prostu użyj:

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

Miauczeć
źródło
-2

lub po prostu (jeśli masz LYNX):

lynx 'http://localhost/index.php?a=1&b=2&c=3'
quardas
źródło
3
To nie uruchamia PHP z wiersza poleceń. Spowoduje to uruchomienie przeglądarki, która wywołuje serwer sieciowy za pośrednictwem wiersza poleceń.
Andrea Lazzarotto