2010-11-15 14 views
99

dire che siamo di solito accesso 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!

risposta

96

In genere, per il passaggio di argomenti per uno script da riga di comando, si utilizzerà uno argv 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 si riferisce alla HTTP GET parametri del metodo, che non sono disponibili nella riga di comando, poiché richiedono un server web da popolare.

Se si vuole veramente popolare $ _GET in ogni caso, si può fare questo:

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

Si può anche eseguire un determinato copione, popolano $_GET dalla 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 è possibile fare lo stesso con $_POST e $_COOKIE.

+0

Vale la pena notare che, sulla nostra macchina Centos 6 con PHP 5.3, chiamare 'php [nome script]" a = 1 & b = 2 & c = 3 "' non popolerà '$ _SERVER ['QUERY_STRING']', ma si può facilmente influenza la stessa cosa facendo riferimento a '$ _SERVER ['argv'] [1]'. –

+3

Prova [questa risposta] (http://stackoverflow.com/a/11965479/648162) per popolare la stringa di query dalla riga di comando senza modificare lo script PHP. – qris

+0

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

9

Prova utilizzando WGET:

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

Si desidera racchiudere l'URL tra virgolette singole, come? e & nella parte della query sono i metacaratteri della shell (carattere jolly singolo + "esegui questo comando in background"). –

+0

@Marc B: Grazie per il suggerimento; Ho aggiornato il comando –

+6

Ciò funzionerà, ma richiede un server Web in esecuzione e rende l'intero processo un po 'più inefficiente del necessario. – Brad

9
php file_name.php var1 var2 varN 

quindi impostare la variabile $ _GET sulla prima linea in PHP, anche se questo non è il modo desiderato di impostare una variabile $ _GET e potrebbero verificarsi problemi a seconda di ciò che si fa più tardi con quella variabile.

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

le variabili con cui si avvia lo script saranno accessibili dall'array $ argv nella propria app php. la prima voce sarà il nome della sceneggiatura da cui provengono, quindi potreste voler fare un array_shift ($ argv) per eliminare la prima voce se volete elaborare un gruppo di variabili. O semplicemente caricare in una variabile locale.

+0

http://php.net/manual/en/function.parse-str.php –

+0

la soluzione più semplice e semplice –

-1

ho solo passo 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" 
} 
+0

appena scoperto funziona sul mio server di hosting, ma non sul mio server locale, pazzo. – Asaf

+0

Forse una differenza nella versione installata? In quale versione ha funzionato questo lavoro per te e quale ha fallito? – Kzqai

+0

php 5.2 su hosting, funziona, 5.3 localmente non ... non importa Ho fatto il modo $ argv nel caso in cui $ _GET sia vuoto – Asaf

196

Da questo answer on ServerFault:

Utilizzare il php-cgi binario invece di php e passare gli argomenti sulla riga di comando, in questo modo:

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

che mette questo in $_GET:

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

È inoltre possibile impostare le variabili d'ambiente che essere 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 
+15

Non so perché questo non ha voti alti. La soluzione più semplice! – FrenchyNZ

+7

+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, potrebbe essere facilmente racchiuso in qualsiasi script dipendente dal sistema operativo. – Sebastian

14

non ho un php binario -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> 
You set foo to 123. 
</html> 

%cat test1.php 
<html>You set foo to <?php print $_GET['foo']?>.</html> 
+0

bel compromesso, +1 – ehime

+0

Sembra un php-modo per risolvere il personale. – FelikZ

0

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

php -a 

tipo Poi:

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

Questo imposterà manualmente tutte le variabili che si desidera e quindi eseguire il file php con quelle variabili set.

-2

o solo (se si dispone di 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. –

-1

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

Si potrebbe fare la prima parte come un alias:

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

quindi è sufficiente utilizzare:

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

2

- Opzione 1: php-cgi -

Usa 'php-cgi' al posto di 'php' per eseguire lo script.Questo è il modo più semplice in quanto non sarà necessario modificare il codice php appositamente per lavorare 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 linea 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 & 2 si accede a questi parametri in questo modo:

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

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

ho trovato questo per essere la migliore soluzione per questo caso:

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

Questo evita alterare il file PHP e consente di utilizzare il comando pianura php. Se hai installato php-cgi, usa questo, ma questa è la cosa migliore. Pensavo che questa opzione fosse degna di menzione

il -r significa eseguire il codice php nella stringa che segue. imposti manualmente il valore $ _GET e poi fai riferimento al file che vuoi eseguire.

Vale la pena notare si dovrebbe eseguire questo nella cartella giusta, spesso, ma non sempre la cartella il file php è. Richiede dichiarazioni utilizzeranno la posizione del vostro comando per risolvere gli URL relativi, non la posizione del file

+0

Voglio ringraziarvi per questa soluzione. Secondo me questa dovrebbe essere la risposta accettata. Non è necessario installare una libreria aggiuntiva per utilizzarla. – swordsecurity

1

Se avete la possibilità di modificare lo script PHP, è possibile artificialmente popolare $ _GET array utilizzando 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

al comando linea incolla il seguente

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";' 
Problemi correlati