Sé de PHP es generalmente utilizado para el desarrollo web, donde hay es no estándar de entrada, pero PHP reclamos para que se pueda usar como un propósito general lenguaje de secuencias de comandos, si sigues es funky basado en la web de los convenios. Sé que PHP imprime a stdout (o lo que sea que quieras llamarlo) con print y echo, que es bastante simple, pero me pregunto cómo un script de PHP puede obtener la entrada de stdin (específicamente con fgetc(), pero cualquier función de entrada es bueno), o es incluso posible?

InformationsquelleAutor Chris Lutz | 2009-02-16

9 Comentarios

  1. 69

    Es posible leer el stdin mediante la creación de un identificador de archivo php://stdin y, a continuación, leer con fgets() para por ejemplo, una línea (o, como ya se ha indicado, fgetc() para un solo carácter):

    <?php
    $f = fopen( 'php://stdin', 'r' );
    
    while( $line = fgets( $f ) ) {
      echo $line;
    }
    
    fclose( $f );
    ?>
    • También se puede utilizar la constante predefinida STDIN, en lugar de abrirlo manualmente: $linea = fgets(STDIN);
    • STDIN no me funciona, pero ‘php://stdin’, ‘r’ hizo. Usando PHP 5.2.9-2 (cli) (construida: 9 Abr 2009 08:23:19) en la Vista.
    • Extraño, ¿cómo sucedió esto? ¿ fclose STDIN?
    • Este fianzas en la primera falsy línea.
  2. 16

    Para evitar tener que ensuciar alrededor con filehandles, uso file_get_contents() y php://stdin:

    $ echo 'Hello, World!' | php -r 'echo file_get_contents("php://stdin");'
    Hello, World!

    (Si estás leyendo una enorme cantidad de datos de stdin usted podría desear utilizar el filehandle enfoque, pero esto debe ser bueno para muchos megabytes).

    • file_get_contents…. va a dar como un enorme problema, ya que el hugeness del archivo.
  3. 11

    Un método simple es

    $var = trim(fgets(STDIN));
    • También podemos utilizar ` $contenido = file_get_contents(«php://input»);`
  4. 6

    Agarrar todos en una sola toma:

    $contents = file_get_contents("php://stdin");
    echo $contents;
  5. 5

    Si mal no recuerdo, usted también puede usar el siguiente:

    $in = fopen(STDIN, "r");
    $out = fopen(STDOUT, "w");

    Técnicamente es la misma, pero un poco de limpiador de sintaxis sabio.

    • Este debe ser un comentario
  6. 2

    Cuando usar fgets, puede bloquear en scripts de bash, si el stdin no se ha establecido o está vacío, entre ellos, mientras que el uso de la @ php error de operador de control de.

    #!/usr/bin/php
    <?php
    $pipe = @trim(fgets(STDIN));
    //Script was called with an empty stdin
    //Fail to continue, php warning 

    Este comportamiento puede ser evitado mediante el establecimiento de stream_set_blocking en el php header:

    #!/usr/bin/php
    <?php
    stream_set_blocking(STDIN, 0);
    $pipe = @trim(fgets(STDIN));
    //Script was called with an empty stdin
    //No errors or warnings, continue 
    echo $pipe . "!";

    Como ejemplo, para ser llamado como sigue:

    echo "Hello world" | ./myPHPscript
    //Output "Hello world!"
    ./myPHPscript
    //Output "!"

Dejar respuesta

Please enter your comment!
Please enter your name here