2008-09-15 21 views
7

Estoy tratando de ejecutar PHP desde la línea de comandos en Windows XP.PHP - argumentos de línea de comando en Windows

Eso funciona, excepto por el hecho de que no puedo proporcionar parámetros a mi script PHP.

Mi caso de prueba:

echo "param = ".$param."\n"; 
var_dump($argv); 

Quiero llamar a esto como:

php.exe -f test.php -- param=test

Pero nunca llegar el guión a aceptar mi parámetro.

El resultado que recibo de la secuencia de comandos

`Aviso PHP: Undefined variable: param en C: \ test.php en la línea 2

param = '' 
array(2) { 
    [0]=> string(8) "test.php" 
    [1]=> string(10) "param=test" 
} 

Estoy tratando mediante PHP 5.2.6 . ¿Es esto un error en PHP5?

El paso de parámetros se maneja en el online help Note: If you need to pass arguments to your scripts you need to pass -- as the first argument when using the -f switch. Esto parecía estar trabajando bajo PHP4, pero no bajo PHP5. Bajo PHP4 podría usar la misma secuencia de comandos que podría ejecutarse en el servidor sin alteración en la línea de comandos. Esto es útil para la depuración local, por ejemplo, guardando la salida en un archivo para ser estudiado.

Respuesta

7

¿Por qué tiene alguna expectativa de que param se establecerá en el valor? Usted es responsable de analizar la línea de comandos de la manera que desee, desde la matriz $ argv.

0

$ argv es una matriz que contiene todos sus parámetros de línea de comandos ... Necesita analizar esa matriz y configurar $ param usted mismo.

$tmp = $argv[1];    // $tmp="param=test" 
$tmp = explode("=", $tmp); // $tmp=Array(0 => param, 1 => test) 

$param = $tmp[1];   // $param = "test"; 
1

PHP no parametriza los parámetros de línea de comandos para usted. Vea la salida donde su 2da entrada en ARGV es "param = prueba".

Lo que probablemente desee es utilizar el paquete PEAR http://pear.php.net/package/Console_CommandLine: "Un analizador de opciones y de argumentos de línea de comandos con todas las funciones".

O puede ser masoquista y agregar código para revisar su ARGV y establecer los parámetros usted mismo. He aquí un fragmento muy simplista para que pueda empezar (esto no funcionará si la primera parte no es un nombre de variable válido o hay más de 1 '=' en una parte ARGV:

foreach($argv as $v) { 
    if(false !== strpos($v, '=')) { 
     $parts = explode('=', $v); 
     ${$parts[0]} = $parts[1]; 
    } 
} 
0

Usted puede hacer algo así como:

if($argc > 1){ 
    if($argv[1] == 'param=test'){ 
     $param = 'test'; 
    } 
} 

Por supuesto, usted puede conseguir mucho más complicado que eso, según sea necesario

3
.

El paso de parámetros se maneja en la ayuda en línea. Nota: si necesita pasar argumentos a sus scripts, debe pasar, como primer argumento cuando usa el modificador -f. Esto parecía estar funcionando bajo PHP4, pero no bajo PHP5.

Pero PHP aún no analiza los argumentos. Simplemente los pasa al script en la matriz $ argv.

La única razón del - es que PHP puede decir qué argumentos están destinados para el ejecutable de PHP y qué argumentos son para su secuencia de comandos.

que le permite hacer cosas como esta:

php -e -n -f myScript.php -- -f -n -e 

(El -f, -n, & -e después de la - se pasan a myscript.php los anteriores se pasan a PHP. sí mismo).

+0

Esto funcionó para mí, gracias ! – montrealist

-1

puede usar la matriz $ argv. de esta manera:

<?php 
echo $argv[1]; 
?> 

recordar que el primer elemento del array $ argv (que es $ argv [0]) es el nombre de la propia secuencia de comandos, por lo que con el fin de utilizar los parámetros para la aplicación, debe comience a usar miembros de $ argv [] del '1 ° índice. cuando se llama a la aplicación, utilice esta sintaxis:

php myscript.php -- myValue 

no hay necesidad de poner un nombre para el parámetro. como viste, lo que llamaste var_dump() en $ argv [], el segundo miembro (que es el primer parámetro) fue la cadena PARAM = TEST. ¿derecho? así que no hay necesidad de ponerle un nombre al param. solo ingrese el valor de param.

+0

'print_r ($ argv)' es más útil para la solución de problemas de una matriz, imho. –

0

Usted podría utilizar algo así como

if (isset($argv[1]) { 
$arg1 = $argv[1];    
$arg1 = explode("=", $arg1); 
$param = $arg1[1];    
} 

(cómo manejar la falta de parámetro/s depende de usted) o si necesita un escenario más complejo, mira en una biblioteca de comandos del analizador como el uno de Pear.

usando el ${$parts[0]} = $parts[1]; publicado en otra solución le permite anular cualquier variable en su código, que realmente no suena seguro.

0

Si le gusta vivir a la vanguardia, PHP 5.3 tiene el comando getOpt() que se encargará de todo este asunto desordenado para usted. Algo.

3

Si desea pasar los parametros similar para obtener VARs, a continuación, puede utilizar la función parse_str(). Algo similar a esto:

<?php 
parse_str($argv[1]); 
?> 

Produciría una variable de $ test con un valor de myValue.

Espero que esto ayude!

0

comando de ejemplo de línea:

anfitrión php myserver.php = 192.168.1.4 puerto = 9000

en myserver.php usar las siguientes líneas:

<?php 

parse_str(implode('&', array_slice($argv, 1)), $_GET); 
// Read Arguments 
if (array_key_exists('host',$_GET)) 
{ 
    $host = $_GET['host']; 
} 
if (array_key_exists('port',$_GET)) 
{ 
    $port = $_GET['port']; 
} 
?> 
Cuestiones relacionadas