2011-07-26 67 views
47

Tengo un archivo PHP que se necesita ejecutar desde la línea de comandos (a través de crontab). Necesito pasar type=daily al archivo, pero no sé cómo. Probé:Pasar variable al script php que se ejecuta desde la línea de comando

php myfile.php?type=daily 

pero fue devuelto este error:

¿No podría abrir archivo de entrada: myfile.php type = diaria

¿Qué puedo hacer yo?

Respuesta

91

El ?type=daily argumento (que termina en la matriz $_GET) solo es válido para páginas a las que se accede por la web.

Tendrá que llamar así php myfile.php daily y recuperar ese argumento de la matriz (que sería $argv[1], ya que sería $argv[0]myfile.php).

Si la página también se usa como página web, hay dos opciones que puede considerar. O bien acceder a él con un script de shell y wget y llamar a eso desde cron:

#!/bin/sh 
wget http://location.to/myfile.php?type=daily 

O comprobar en el archivo PHP si se llama desde la línea de comandos o no:

if (defined('STDIN')) { 
    $type = $argv[1]; 
} else { 
    $type = $_GET['type']; 
} 

(Nota: Usted probablemente necesita/quiere comprobar si realidad contiene suficientes variables y tal)

41

Simplemente pásalo como parámetros normales y accede a él en PHP usando la matriz .

php myfile.php daily 

y en myfile.php

$type = $argv[1]; 
+0

tenía un error: "offset indefinido" – Tarek

+0

gracias, todo funciona ahora. – Tarek

+1

Uso: if (isset ($ argv [1])) { echo. $ argv [1]; } else { \t morir ('no!'); } – demenvil

6

parámetros enviar por índice como otra aplicación

php myfile.php type=daily 

y entonces usted puede gat ellos de esta manera

<?php 
if (count($argv) == 0) exit; 
foreach ($argv as $arg) 
    echo $arg; 
?> 
+2

esto no es realmente tan conveniente, no separa la clave y el valor, solo pasa el valor "tipo = diario" – spybart

1
<?php 
if (count($argv) == 0) exit; 
foreach ($argv as $arg) 
echo $arg; 
?> 

Este código no debe ser utilizado. En primer lugar CLI denominada como:/usr/bin/php phpscript.php tendrá un valor de argv que es el nombre del script de

array(2) { 
    [0]=> 
    string(13) "phpscript.php" 
} 

Ésta será siempre ejecutarse desde tendrá 1 o 2 args passe

3

Guarde este código en el archivo myfile.php y se ejecuta como php myfile.php type=daily

<?php 
$a = $argv; 
$b = array(); 
if (count($a) == 0) exit; 
foreach ($a as $arg){ 
    list($x,$y) = explode('=', $arg); 
    $b["$x"] = $y; 
} 
?> 

Si se agrega antes de la etiqueta var_dump($b);?>, se verá que la matriz contiene $btype => daily.

+1

Si bien esto puede responder a la pregunta, considere agregar detalles sobre cómo esta solución resuelve el problema . Por favor, consulte http://stackoverflow.com/help/how-to-answer. –

+0

Guarde este código en el archivo myfile.php – easyaspi

+0

Guarde este código en el archivo myfile.php y ejecútelo como 'php myfile.php type = daily' si agrega var_dump ($ b); antes de la etiqueta?>, verás que la matriz $ b contiene tipo => diario. – easyaspi

6

Estas líneas convertirá los argumentos de una llamada CLI como php myfile.php "type=daily&foo=bar" en el conocido $_GET -array :

if (!empty($argv[1])) { 
    parse_str($argv[1], $_GET); 
} 

a pesar de que es bastante complicado para sobrescribir el $_GET -array mundial, convierte todos los scripts rápidamente a aceptar argumentos CLI.

Ver http://php.net/manual/en/function.parse-str.php para más detalles.

+0

¡Respuesta perfecta! ¡Gracias! – Reado

-1
if (isset($argv) && is_array($argv)) { 
    $param = array(); 
    for ($x=1; $x<sizeof($argv);$x++) { 
     $pattern = '#\/(.+)=(.+)#i'; 
     if (preg_match($pattern, $argv[$x])) { 
      $key = preg_replace($pattern, '$1', $argv[$x]); 
      $val = preg_replace($pattern, '$2', $argv[$x]); 
      $_REQUEST[$key] = $val; 
      $$key = $val; 
     }  
    } 
} 

puse parámetros en $ _REQUEST

$ _REQUEST [$ key] = $ val;

y también se puede utilizar directamente

$$ clave = $ val

uso esto como que:

myFile.php/clave = val

Cuestiones relacionadas