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!

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.


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

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>

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


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.


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'

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"];

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.


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'
    }
}

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

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"
}

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'


-2

o simplemente (si tienes 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 comando.
Andrea Lazzarotto
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.