2010-11-15 10 views
99

digo que por lo general el acceso a través

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

¿Cómo llevamos a cabo en el mismo símbolo del sistema Linux?

php -e index.php 

Pero, ¿qué hay de pasar las variables $ _GET? Tal vez algo como php -e index.php --a 1 - b 2 --c 3? Duda que eso funcione.

¡Gracias!

Respuesta

96

Típicamente, para pasar argumentos a un script de línea de comandos, que va a utilizar, ya sea argv variable global 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 se refiere a los protocolos HTTP GET parámetros de método, que no están disponibles en la línea de comandos, ya que requieren un servidor web para poblar.

Si realmente desea llenar $ _GET todos modos, se puede hacer esto:

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

También puede ejecutar un script dado, llenar $_GET desde la línea de comandos, sin tener que modificar dicho guión:

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

Tenga en cuenta que puede hacer lo mismo con $_POST y $_COOKIE también.

+0

Vale la pena señalar que, en nuestra máquina Centos 6 que ejecuta PHP 5.3, llamar 'php [nombre de script] '' a = 1 & b = 2 & c = 3 '' no completará' $ _SERVER ['QUERY_STRING'] ', pero puede fácilmente afecta lo mismo al hacer referencia a '$ _SERVER ['argv'] [1]'. –

+3

Pruebe [esta respuesta] (http://stackoverflow.com/a/11965479/648162) para rellenar la cadena de consulta desde la línea de comandos sin modificar el script PHP. – qris

+0

Esta no es la mejor respuesta. Vea esta otra respuesta en esta página: http://stackoverflow.com/a/11965479/543738 –

9

Intente utilizar WGET:

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

¿Le gustaría encerrar la URL entre comillas simples, como? y & en la porción de consulta son metacaracteres del shell (comodín de un solo carácter + "ejecutar este comando en el fondo"). –

+0

@Marc B: gracias por la pista; He actualizado el comando –

+6

Esto funcionará, pero requiere un servidor web en ejecución, y hace que todo el proceso sea un poco más ineficiente de lo que se requiere. – Brad

9
php file_name.php var1 var2 varN 

A continuación, establecer las variables $ _GET en su primera línea en PHP, aunque esta no es la forma deseada de establecer una variable $ _GET y puede experimentar problemas en función de lo que se hace después con esa variable.

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

las variables que inicie el guión con será accesible desde la matriz argv $ en su aplicación PHP. la primera entrada indicará el nombre del script del que provienen, por lo que es posible que desee hacer un desplazamiento de matriz ($ argv) para eliminar esa primera entrada si desea procesar un grupo de variables. O solo cargue en una variable local.

+0

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

+0

la solución más fácil y más simple –

-1

acabo de pasar como esto:

php5 script.php param1=blabla param2=yadayada 

funciona bien, el array $ _GET es:

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

acaba de descubrir que esto funciona en mi servidor de alojamiento, pero no en mi servidor local, extraño. – Asaf

+0

¿Tal vez una diferencia en la versión instalada? ¿Qué versión funcionó para usted y cuál falló? – Kzqai

+0

php 5.2 en hosting, funciona, 5.3 localmente no ... no importa Lo hice por $ argv en caso de que $ _GET esté vacío – Asaf

196

De esta answer on ServerFault:

Uso del php-cgi binario en lugar de sólo php, y pase los argumentos en la línea de comando, así:

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

Qué pone esto en $_GET:

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

También puede establecer las variables de entorno que se establecen por el servidor web, así:

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

No sé por qué esto no tiene ningún voto positivo. ¡La solución más fácil! – FrenchyNZ

+7

+1 y +1: Esta respuesta debería haber sido la aceptada. ¡Mucho menos molestias! No es necesario cambiar la fuente de php. – micha

+2

Excelente, esto podría ser fácilmente envuelto en cualquier script dependiente del sistema operativo. – Sebastian

14

no tengo un php binaria -cgi en Ubuntu, así que hice esto:

 
% 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

Buen compromiso, +1 – ehime

+0

Parece una forma de arreglar el personal. – FelikZ

0

Si tiene que pasar $ _GET, $ _REQUEST $ _POS T, o cualquier otra cosa que también se puede usar PHP modo interactivo:

php -a 

escriba:

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

Esto establecerá manualmente las variables que desee y ejecute el archivo PHP con esas variables establecidas.

-2

o simplemente (si tiene LYNX):

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

Esto no ejecuta PHP desde la línea de comandos. Esto ejecuta un navegador que invoca el servidor web a través de la línea de comandos. –

-1

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

usted podría hacer la primera parte como un alias:

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

a continuación, utilizar simplemente:

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

2

- Opción 1: php-cgi -

Uso 'php-cgi' en lugar de 'php' para ejecutar la secuencia de comandos.Esta es la forma más sencilla, ya que no tendrá que modificar su código php especialmente para trabajar con él:

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

- Opción 2: si tiene un servidor web -

Si el archivo PHP está en un servidor web puede utilizar 'wget' en la línea de comandos:

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" 

- Acceso a las variables en PHP -

Tanto en la opción 1 & 2 se accede a estos parámetros como esto:

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

A veces usted no tiene la opción de editar el archivo php para configurar $ _GET a los parámetros pasados, y algunas veces no puede o no quiere instalar php-cgi.

Me pareció que para ser la mejor solución para este caso:

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

Esto evita la alteración de su archivo PHP y le permite utilizar el comando sin formato php. Si tiene instalado php-cgi, utilícelo, pero esta es la mejor opción. Pensaba que esta opción era digna de mención

el -r significa ejecutar el código php en el siguiente string. configura el valor $ _GET de forma manual y luego hace referencia al archivo que desea ejecutar.

Vale la pena señalar que debe ejecutar esto en la carpeta correcta, a menudo, pero no siempre la carpeta del archivo PHP se encuentra. Requiere declaraciones utilizarán la ubicación de su comando para resolver las direcciones URL relativa, no la ubicación del archivo

+0

Quiero agradecerle por esta solución. En mi opinión, esta debería ser la respuesta aceptada. No tiene que instalar una biblioteca adicional para usarlo. – swordsecurity

1

Si usted tiene la posibilidad de editar el script PHP, puede rellenar artificialmente $ _GET matriz mediante el siguiente código al principio de la secuencia de comandos y luego llamar a la secuencia de comandos con la sintaxis: 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

a la orden línea pegar el siguiente

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";' 
Cuestiones relacionadas