PHP passando $ _GET nel prompt dei comandi di linux


125

Supponiamo che di solito accediamo tramite

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

Come eseguiamo lo stesso nel prompt dei comandi di linux?

php -e index.php

Ma per quanto riguarda il passaggio delle variabili $ _GET? Forse qualcosa come php -e index.php --a 1 --b 2 --c 3? Dubbio che funzionerà.

Grazie!

Risposte:


122

In genere, per passare argomenti a uno script da riga di comando, si utilizzerà o argvla variabile globale o 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 fa riferimento ai parametri del metodo GET HTTP, che non sono disponibili nella riga di comando, poiché richiedono la compilazione di un server Web.

Se vuoi davvero popolare $ _GET, puoi farlo:

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

Puoi anche eseguire un determinato script, compilare $_GETdalla riga di comando, senza dover modificare detto script:

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

Nota che puoi fare lo stesso con $_POSTe $_COOKIEanche.


1
Vale la pena notare che, sulla nostra macchina Centos 6 che esegue PHP 5.3, la chiamata php [script name] "a=1&b=2&c=3"non popolerà il $_SERVER['QUERY_STRING'], ma puoi facilmente influenzare la stessa cosa facendo riferimento $_SERVER['argv'][1].
Eric L.

4
Prova questa risposta per popolare la stringa di query dalla riga di comando senza modificare lo script PHP.
Qris,

Questa non è la risposta migliore. Vedi questa altra risposta in questa pagina: stackoverflow.com/a/11965479/543738
LS

Risposta utile, anche se se come me ti stai chiedendo in cosa consistano quei due punti dopo i nomi degli argomenti getopt(), questo a quanto pare dice a PHP che vuoi l' argomento f , non l' opzione f (che sarebbe specificata meno i due punti). Quindi è solo sintassi.
Mitya,

Mi piace davvero l'ultima risposta e l'ho usata ieri. Può anche essere trasformato in una sceneggiatura.
reinierpost,

239

Da questa risposta su ServerFault :

Usa il php-cgibinario invece di just phpe passa gli argomenti sulla riga di comando, in questo modo:

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

Il che mette questo in $_GET:

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

È inoltre possibile impostare variabili di ambiente che verrebbero impostate dal server Web, in questo modo:

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

10
+1 e +1: questa risposta avrebbe dovuto essere la risposta accettata. Molto meno fastidio! Non c'è bisogno di cambiare la fonte php.
Micha,

2
Eccellente, questo potrebbe essere facilmente racchiuso in qualsiasi script dipendente dal sistema operativo.
Sebastian,

2
+1, soluzione fantastica, attualmente sto eseguendo il backport di tutti i miei script CLI per supportarlo ora;)
ehime

L'unico aspetto negativo che ho visto finora è che l'output del terminale è HTML con <br /> anziché solo \ n. Questo vale anche per tutti gli avvisi e gli errori, ad esempio<b>Notice</b>: Undefined index: testing in <b> ... </b><br />
bafromca,

+1 Fantastico, Funziona in Script normale $ _VALUTA Valore per Ex come: php-cgi -f /var/www/vhosts/example.com/public_html/index.php action=DoSomething Funziona bene ..
Ajmal Praveen

16

Non ho un binario php-cgi su Ubuntu, quindi ho fatto questo:

% alias php-cgi = "php -r '"' parse_str (implode ("&", array_slice ($ argv, 2)), $ _GET); include ($ argv [1]); '"' -"
% php-cgi test1.php foo = 123
<Html>
Hai impostato foo su 123.
</ Html>

% cat test1.php
<html> Hai impostato foo su <? php print $ _GET ['foo']?>. </html>

Sembra un modo php per riparare il personale.
FelikZ,

14

A volte non hai la possibilità di modificare il file php per impostare $ _GET sui parametri passati, e talvolta non puoi o non vuoi installare php-cgi.

Ho scoperto che questa è la soluzione migliore per quel caso:

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

Questo evita di alterare il tuo file php e ti consente di usare il semplice comando php. Se hai installato php-cgi, usalo sicuramente, ma questa è la cosa migliore da fare. Ho pensato che questa opzione fosse degna di menzione

-r significa eseguire il codice php nella stringa seguente. si imposta manualmente il valore $ _GET lì, quindi si fa riferimento al file che si desidera eseguire.

Vale la pena notare che dovresti eseguirlo nella cartella giusta, spesso ma non sempre nella cartella in cui si trova il file php. Richiede che le istruzioni utilizzino la posizione del tuo comando per risolvere gli URL relativi, NON la posizione del file


1
Voglio ringraziarti per questa soluzione. Secondo me questa dovrebbe essere la risposta accettata. Non è necessario installare una libreria aggiuntiva per usarla.
swordsecurity

Questo è molto meglio della risposta accettata. Promuovi per te!
faraday703,

soluzione meravigliosa e facile!
derRobert,

Risposta fantastica. Manca solo una citazione finale nel tuo codice :)
Pedro Araujo Jorge,

10
php file_name.php var1 var2 varN

Quindi imposta le tue $_GETvariabili sulla prima riga in PHP, anche se questo non è il modo desiderato di impostare una $_GETvariabile e potresti riscontrare problemi a seconda di cosa farai successivamente con quella variabile.

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

le variabili con cui avvii lo script saranno accessibili $argvdall'array nella tua app PHP. la prima voce sarà il nome dello script da cui provengono, quindi potresti voler fare un array_shift($argv)drop per eliminare quella prima voce se vuoi elaborare un mucchio di variabili. O semplicemente caricare in una variabile locale.


la soluzione più semplice e più semplice
João Pimentel Ferreira,

9

Prova a usare WGET:

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

1
Vorresti racchiudere l'URL tra virgolette singole, come il? e & nella parte della query sono i metacaratteri della shell (carattere jolly a carattere singolo + "esegui questo comando in background").
Marc B,

7
Funzionerà, ma richiede un server Web in esecuzione e rende l'intero processo un po 'più inefficiente del necessario.
Brad,

Lo fa, ma in genere $_GETimplica un server web in esecuzione.
cambio rapido

6

- Opzione 1: php-cgi -

Usa 'php-cgi' al posto di 'php' per eseguire il tuo script. Questo è il modo più semplice in quanto non sarà necessario modificare appositamente il codice php per funzionare con esso:

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

- Opzione 2: se si dispone di un server Web -

Se il file php si trova su un server Web è possibile utilizzare 'wget' sulla riga di comando:

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

O:

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

- Accesso alle variabili in php -

In entrambe le opzioni 1 e 2 accedi a questi parametri in questo modo:

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

2

Se è necessario passare $_GET, $_REQUEST, $_POST, o qualsiasi altra cosa si può anche utilizzare la modalità interattiva PHP:

php -a

Quindi digitare:

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

Questo imposterà manualmente tutte le variabili che desideri e quindi eseguirà il tuo file php con quelle variabili impostate.


1

Se hai la possibilità di modificare lo script PHP, puoi popolare artificialmente l'array $ _GET usando il seguente codice all'inizio dello script e quindi chiamare lo script con la sintassi: 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

Alla riga di comando, incollare quanto segue

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

Li passo appena in questo modo:

php5 script.php param1=blabla param2=yadayada

funziona bene, l'array $ _GET è:

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

ho appena scoperto che funziona sul mio server di hosting, ma non sul mio server locale, strano.
Asaf,

Forse una differenza nella versione installata? Su quale versione ha funzionato per te e quale ha fallito?
Kzqai,

php 5.2 su hosting, funziona, 5.3 localmente non ... non importa che l'ho fatto nel modo $ argv nel caso in cui $ _GET sia vuoto
Asaf

-1

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

È possibile creare la prima parte come alias:

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

quindi usa semplicemente:

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


-2

o solo (se hai LYNX):

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

3
Questo non esegue PHP dalla riga di comando. Questo esegue un browser che richiama il server Web attraverso la riga di comando.
Andrea Lazzarotto,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.