2009-02-16 21 views
44

Sé que PHP se usa generalmente para el desarrollo web, donde es no es una entrada estándar, pero PHP afirma ser utilizable como un lenguaje de scripting de propósito general, si sigues sus convenciones funky basadas en web. Sé que PHP imprime a stdout (o lo que quieras llamar) con print y echo, lo cual es bastante simple, pero me pregunto cómo un script PHP puede obtener entrada desde stdin (específicamente con fgetc(), pero cualquier función de entrada es bien), o esto es posible?Entrada estándar PHP?

Respuesta

64

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

<?php 
$f = fopen('php://stdin', 'r'); 

while($line = fgets($f)) { 
    echo $line; 
} 

fclose($f); 
?> 
+21

También es posible usar la constante predefinida STDIN en lugar de abrirlo manualmente: Línea $ = fgets (stdin); – gix

+2

STDIN no funcionó para mí, pero 'php: // stdin', 'r' sí. Usando PHP 5.2.9-2 (cli) (construido: 9 de abril de 2009 08:23:19) en Vista. –

+0

@EricJ., Raro, ¿cómo sucedió eso? ¿Has 'fclose'' STDIN'? – Pacerier

8

Puede utilizar fopen() en php://stdin:

$f = fopen('php://stdin', 'r'); 
5

IIRC, también se puede utilizar lo siguiente:

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

Técnicamente igual, pero un poco más limpio en sintaxis.

+1

Esto debería ser un comentario –

36

lectura de STDIN es recommended way

<?php 
while (FALSE !== ($line = fgets(STDIN))) { 
    echo $line; 
} 
?> 
12

Para no tener que perder el tiempo con controladores de archivo, utilice file_get_contents() y php://stdin:

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

(Si está leyendo una cantidad enorme de verdad datos de stdin es posible que desee utilizar el enfoque filehandle, pero esto debería ser bueno para muchos megabytes.)

+1

'file_get_contents' .... dará un problema tan grande como la enormidad del archivo. – Pacerier

11

Un método simple es

$var = trim(fgets(STDIN)); 
+2

También podemos usar '$ contents = file_get_contents (" php: // input ");' –

5

Grab todo de una sola vez:

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

Esto también funciona:

$data = stream_get_contents(STDIN); 
0

Al utilizar fgets, puede bloquear en scripts bash, si el stdin no está configurado o vacío, incluso mientras usa @php error control operator.

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

Este comportamiento se puede evitar mediante el establecimiento de stream_set_blocking en la cabecera php:

#!/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 
Cuestiones relacionadas