Ejecutando un script PHP como un script de consola


Hay varias formas distintas de proveer a la SAPI CLI con código PHP para que sea ejecutado:
  1. Decirle a PHP que ejecute un determinado fichero.
    $ php mi_script.php
    
    $ php -f mi_script.php
    
    Ambas formas (usando o no el modificador -f ) ejecutan el fichero mi_script.php. Nótese que no hay restricción sobre cuales ficheros puede ser ejecutado; en particular, el nombre del fichero no es necesario que tenga una extensión .php.



    Sin embargo, en sistemas Unix, hay otra forma de usar PHP para scripts de consola. Se puede escribir un script en el que la primera línea comience con #!/usr/bin/php (sustitúyalo por la ruta a su CLI binario de PHP si es diferente). El resto del fichero debería contener código PHP normal con las etiquetas usuales de inicio y fin de PHP. Una vez que se otorguen permisos de ejecución al fichero apropiadamente (p.ej. chmod +x test) el script podrá ejecutarse como cualquier otro script de consola o perl:

     #!/usr/bin/php
    <?php
    var_dump
    ($argv);?>

    Asumiendo que este fichero se llama test y que está en el directorio actual, es posible hacer lo siguiente:
    $ chmod +x test
    $ ./test -h -- foo
    array(4) {
      [0]=>
      string(6) "./test"
      [1]=>
      string(2) "-h"
      [2]=>
      string(2) "--"
      [3]=>
      string(3) "foo"
    }
     El ejecutable de PHP puede ser utilizado para ejecutar scripts de PHP que sean absolutamente independientes del servidor web. En sistemas Unix, los caracteres especiales #! (o conocido como "shebang") deben añadirse en la primera línea del script seguido de la ruta hacia el binario de PHP para que le indique autom[aticamente al sistema cual es el programa que debería ejecutar al script. En plataformas Windows puede asociar php.exe para que funcione al hacer doble clic en ficheros con extensión .php, o se puede hacer un fichero por lotes para ejecutar el script mediante PHP. La primera línea especial "shebang" que se añade a un script para que funcione en Unix no interferirá en Windows (ya que está formateado como un comentario de PHP), así que pueden escribirse programas para plataformas independientes incluyéndose sin ningún problema. Más abajo puede encontrarse un ejemplo sencillo de cómo escribir un programa de línea de comandos en PHP.


    Ejemplo #2 Script destinado a ejecutarse desde la línea de comandos (script.php)
    #!/usr/bin/php
    <?phpif ($argc != || in_array($argv[1], array('--help''-help''-h''-?'))) {?>
    Éste es un script PHP de línea de comandos con un parámetro.

      Uso:
      <?php echo $argv[0]; ?> <parámetro>

      <parámetro> puede ser alguna palabra que desee
      mostrar en pantalla. Con las opciones --help, -help, -h,
      o -?, puede mostrarse esta ayuda.

    <?php} else {
        echo 
    $argv[1];
    }
    ?>
    El script de arriba, incluye la primera línea especial "shebang" de Unix para indicar que este fichero debería ejecutarse por PHP. Puesto que aquí estamos trabajando con una versión CLI, no se mostrarán cabeceras HTTP.
    El programa comprueba primero que hay más de un parámetro (adicionalmente al nombre del script, el cual también es contado). Si no lo hay, o si el parámetro fuese --help , -help , -h o -? , se imprime el mensaje de ayuda, utilizando $argv[0] para escribir el nombre del script dinámicamente tal como se escribió en la línea de comandos. De otra manera, el parámetro es mostrado exactamente como se recibió.
    Para ejecutar el script superior en Unix, debe otorgarle permisos de ejecución al fichero para hacerlo ejecutable, y llamarlo simplemente como script.php mostrar_esto o script.php -h. En Windows, se puede crear un fichero por lotes para lograr esta tarea:

    Ejemplo #3 Fichero por lotes para ejecutar un script PHP en línea de comandos (script.bat)
    @echo OFF
    "C:\php\php.exe" script.php %*
    Asumiendo que el programa superior se llamara script.php, y CLI php.exe estuviera en C:\php\php.exe , este fichero por lotes lo ejecutaría automáticamente con los parámetros que se le hayan pasado: script.bat mostrar_esto o script.bat -h.
    Vea también la documentación de extensión Readline para conocer más funciones que pueden ser utilizadas para mejorar las aplicaciones de línea de comandos en PHP.
    Si está en Windows, puede configurar PHP para que no sea necesario añadir ni C:\php\php.exe ni la extensión .php, tal como se describe en PHP en Línea de Comandos en Microsoft Windows.

    Otro script  imprimiendo un bucle con numeros y accediendo a una base de datos mysql.

     #!/usr/bin/php
    <?php
    var_dump($argv);
    $i = 1;
    while ($i <= 1000){

     echo $i . "\n";

        $i++;
    }

    $mysqli = new mysqli("localhost", "root", "123456", "FlughafenDB");
    {


    $query = $mysqli -> query ("select * from flug limit 20");
            while ($valores = $query->fetch_assoc()) {
                    echo $valores['flug_id'] ." " . $valores['flugnr']  ." ". $valores['ankunft']. " ". $valores['abflug']. " ".  $valores['fluglinie_id']. "\n";
            }
    }
    ?>
    Suponiendo que este fichero se llame test. No hace falta poner extension.
    $ chmod +x test
    $ ./test 

    la salida por pantalla seria :
    ...
     986
    987
    988
    989
    990
    991
    992
    993
    994
    995
    996
    997
    998
    999
    1000
    1 AF1078 2015-06-01 20:46:00 2015-06-01 10:15:00 1
    2 AF1377 2015-06-02 10:05:00 2015-06-01 23:41:00 1
    3 AF1518 2015-06-01 11:13:00 2015-06-01 03:39:00 1
    4 AF1593 2015-06-01 16:48:00 2015-06-01 00:02:00 1
    5 AF1632 2015-06-02 09:22:00 2015-06-01 19:44:00 1
    6 AF1748 2015-06-01 19:51:00 2015-06-01 08:31:00 1
    7 AF1837 2015-06-01 18:51:00 2015-06-01 07:24:00 1
    8 AF1908 2015-06-01 17:05:00 2015-06-01 05:47:00 1
    9 AF2227 2015-06-01 18:19:00 2015-06-01 05:00:00 1
    10 AF3068 2015-06-01 23:59:00 2015-06-01 06:00:00 1
    11 AF3226 2015-06-02 06:43:00 2015-06-01 16:14:00 1
    12 AF3230 2015-06-01 19:38:00 2015-06-01 07:38:00 1
    13 AF3256 2015-06-02 05:32:00 2015-06-01 13:22:00 1
    14 AF3430 2015-06-01 15:04:00 2015-06-01 02:58:00 1
    15 AF3676 2015-06-02 07:00:00 2015-06-01 20:30:00 1
    16 AF3985 2015-06-02 15:43:00 2015-06-01 22:33:00 1
    17 AF4041 2015-06-01 10:44:00 2015-06-01 09:23:00 1
    18 AF4056 2015-06-02 04:49:00 2015-06-01 09:35:00 1
    19 AF4126 2015-06-02 10:27:00 2015-06-01 20:42:00 1
    20 AF4264 2015-06-01 22:44:00 2015-06-01 04:11:00 1


    El mismo script en  PDO  y con la misma salida seria:


    #!/usr/bin/php
    <?php
    var_dump($argv);
    $i = 1;
    while ($i <= 1000){

     echo $i . "\n";
        $i++;
    }



       $db = new PDO("mysql:host=localhost;dbname=FlughafenDB", "root", "3266root");
       $datos=$db->prepare("select * from flug limit 20");
       $datos->execute();


    $result = $datos->fetchAll(PDO::FETCH_ASSOC);
    foreach ($result as $valores) {

    echo $valores['flug_id'] ." " . $valores['flugnr']  ." ". $valores['ankunft']. " ". $valores['abflug']. " ".  $valores['fluglinie_id']. "\n";

    }

    ?>





Ahora un script  con entrada de argumentos:

#!/usr/bin/php
// para ejecutar : ./test2 Numero de registros.  Ejemplo : ./test2 30


<?php

var_dump($argv);
$i = 1;
while ($i <= 10){

 echo $i . "\n";
    $i++;
}
$nu=(int)$argv[1];
echo $argv[1];

   $db = new PDO("mysql:host=localhost;dbname=FlughafenDB", "root", "3266root");
   $datos=$db->prepare("select * from flug limit $nu");
   $datos->execute();


$result = $datos->fetchAll(PDO::FETCH_ASSOC);
foreach ($result as $valores) {

echo $valores['flug_id'] ." " . $valores['flugnr']  ." ". $valores['ankunft']. " ". $valores['abflug']. " ".  $valores['fluglinie_id']. "\n";

}

?>


Ahora otro script con entrada por teclado:

#!/usr/bin/php
// para ejecutar : ./test3 e introducir cuando se nos pregunte el numero de registros a imprimir


<?php
echo "Escribe numero de registros a imprimir: "; $numero = trim(fgets(STDIN));



   $db = new PDO("mysql:host=localhost;dbname=FlughafenDB", "root", "3266root");
   $datos=$db->prepare("select * from flug limit $numero");
   $datos->execute();


$result = $datos->fetchAll(PDO::FETCH_ASSOC);
foreach ($result as $valores) {

echo $valores['flug_id'] ." " . $valores['flugnr']  ." ". $valores['ankunft']. " ". $valores['abflug']. " ".  $valores['fluglinie_id']. "\n";

}

?>




Comentarios