PHP pasa $ _GET en el símbolo del sistema de Linux

125

Digamos que generalmente accedemos a través de

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

¿Cómo ejecutamos lo mismo en el símbolo del sistema de 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!

Patricio
fuente

Respuestas:

122

Por lo general, para pasar argumentos a un script de línea de comando, usará una argvvariable 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 parámetros del método HTTP GET, que no están disponibles en la línea de comandos, ya que requieren un servidor web para rellenar.

Si realmente desea completar $ _GET de todos modos, 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, completar $_GETdesde la línea de comando, sin tener que modificar dicho script:

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 $_POSTy $_COOKIEtambién.

netcoder
fuente
1
Vale la pena señalar que, en nuestra máquina Centos 6 que ejecuta PHP 5.3, las llamadas php [script name] "a=1&b=2&c=3"no se completarán $_SERVER['QUERY_STRING'], pero puede afectar fácilmente lo mismo haciendo referencia $_SERVER['argv'][1].
Eric L.
44
Pruebe esta respuesta para completar la cadena de consulta desde la línea de comandos sin modificar el script PHP.
qris
Esta no es la mejor respuesta. Vea esta otra respuesta en esta página: stackoverflow.com/a/11965479/543738
LS
Respuesta útil, aunque si como yo te preguntas qué son esos dos puntos después de los nombres de los argumentos getopt(), aparentemente esto le dice a PHP que quieres el argumento f , no la opción f (que se especificaría menos los dos puntos). Entonces es solo sintaxis.
Mitya
Realmente me gusta la última respuesta, y la usé ayer. También se puede convertir en un script.
reinierpost
239

De esta respuesta en ServerFault :

Use el php-cgibinario en lugar de solo 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

Lo que pone esto en $_GET:

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

También puede establecer variables de entorno que establecería el servidor web, de esta manera:

REQUEST_URI='/index.php' SCRIPT_NAME='/index.php' php-cgi -f index.php left=1058 right=1067 class=A language=English
qris
fuente
10
+1 y +1: esta respuesta debería haber sido la respuesta aceptada. Mucho menos molestia! No es necesario cambiar la fuente de php.
micha
2
Excelente, esto podría incluirse fácilmente en cualquier script dependiente del sistema operativo.
Sebastian
2
+1, solución increíble, actualmente estoy respaldando todos mis scripts de CLI para admitir esto ahora;)
ehime
El único inconveniente que he visto hasta ahora es que la salida del terminal es HTML con <br /> en lugar de solo \ n. Esto también se aplica a todos los avisos y errores, por ejemplo<b>Notice</b>: Undefined index: testing in <b> ... </b><br />
bafromca
+1 Impresionante, esto funciona en script normal $ _GET Valor para Ej como: php-cgi -f /var/www/vhosts/example.com/public_html/index.php action=DoSomething funciona bien ..
Ajmal Praveen
16

No tengo un binario php-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>
Estableces foo en 123.
</html>

% cat test1.php
<html> Configura foo en <? php print $ _GET ['foo']?>. </html>
Tim Booth
fuente
Parece una forma de php para arreglar el personal.
FelikZ
14

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

Encontré que esta es la mejor solución para ese caso:

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

Esto evita alterar su archivo php y le permite usar el comando php simple. Si tiene instalado php-cgi, utilícelo, pero esta es la mejor opción. Pensé que estas opciones eran dignas de mención

el -r significa ejecutar el código php en la siguiente cadena. configura el valor $ _GET manualmente allí 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 en la que se encuentra el archivo php. Requiere que las declaraciones usen la ubicación de su comando para resolver las URL relativas, NO la ubicación del archivo

derrick the white
fuente
1
Quiero agradecerles por esta solución. En mi opinión, esta debería ser la respuesta aceptada. No tiene que instalar una biblioteca adicional para usarla.
espada de seguridad
Esto es mucho mejor que la respuesta aceptada. ¡Vota por ti!
faraday703
¡Impresionante y fácil solución!
derRobert
Impresionante respuesta. Solo te falta una cita final en tu código :)
Pedro Araujo Jorge
10
php file_name.php var1 var2 varN

Luego, configure sus $_GETvariables en su primera línea en PHP, aunque esta no es la forma deseada de establecer una $_GETvariable y puede experimentar problemas dependiendo de lo que haga más adelante con esa variable.

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

las variables con las que inicie el script serán accesibles desde la $argvmatriz en su aplicación PHP. la primera entrada será el nombre de la secuencia de comandos de la que provienen, por lo que es posible que desees array_shift($argv)eliminar esa primera entrada si deseas procesar un montón de variables. O simplemente cargar en una variable local.

T. Brian Jones
fuente
la solución más fácil y sencilla
João Pimentel Ferreira
9

Intenta usar WGET:

WGET 'http://localhost/index.php?a=1&b=2&c=3'
Giuseppe Accaputo
fuente
1
¿Desea encerrar la URL entre comillas simples, como el? y & en la parte de consulta son metacaracteres de shell (comodín de carácter único + "ejecutar este comando en segundo plano").
Marc B
77
Esto funcionará, pero requiere un servidor web en ejecución, y hace que todo el proceso sea un poco más ineficiente de lo necesario.
Brad
Lo hace, pero generalmente $_GETimplica un servidor web en ejecución.
quickshiftin
6

- Opción 1: php-cgi -

Use 'php-cgi' en lugar de 'php' para ejecutar su script. Esta es la forma más sencilla, ya que no necesitará modificar especialmente su código php 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 usar 'wget' en la línea de 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"

- Accediendo a las variables en php -

En ambas opciones 1 y 2, accede a estos parámetros de esta manera:

$a = $_GET["a"];
$b = $_GET["b"];
$c = $_GET["c"];
Bastión
fuente
2

Si tiene que pasar $_GET, $_REQUEST, $_POST, o cualquier otra cosa que usted puede también utilizar el modo interactivo PHP:

php -a

Luego escriba:

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

Esto establecerá manualmente las variables que desee y luego ejecutará su archivo php con esas variables establecidas.

makman99
fuente
1

Si tiene la posibilidad de editar el script PHP, puede poblar artificialmente la matriz $ _GET utilizando el siguiente código al comienzo del script y luego llamar al script 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'
    }
}
lucaferrario
fuente
1

En la línea de comando pegue lo 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";'
Jimmy Moran
fuente
0

Solo los paso así:

php5 script.php param1=blabla param2=yadayada

funciona bien, la matriz $ _GET es:

array(3) {
  ["script_php"]=>
  string(0) ""
  ["param1"]=>
  string(6) "blabla"
  ["param2"]=>
  string(8) "yadayada"
}
Asaf
fuente
acabo de descubrir que esto funciona en mi servidor de alojamiento, pero no en mi servidor local, extraño.
Asaf
Tal vez una diferencia en la versión instalada? ¿En qué versión funcionó esto para usted y cuál falló?
Kzqai
php 5.2 en hosting, funciona, 5.3 localmente no ... no importa lo hice de la manera $ argv en caso de que $ _GET esté vacío
Asaf
-1

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

Podrías hacer la primera parte como un alias:

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

entonces simplemente use:

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

maullar
fuente
-2

o simplemente (si tienes LYNX):

lynx 'http://localhost/index.php?a=1&b=2&c=3'
quardas
fuente
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 comando.
Andrea Lazzarotto