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
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);
?>
Puede utilizar fopen()
en php://stdin
:
$f = fopen('php://stdin', 'r');
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.
Esto debería ser un comentario –
lectura de STDIN es recommended way
<?php
while (FALSE !== ($line = fgets(STDIN))) {
echo $line;
}
?>
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.)
'file_get_contents' .... dará un problema tan grande como la enormidad del archivo. – Pacerier
Un método simple es
$var = trim(fgets(STDIN));
También podemos usar '$ contents = file_get_contents (" php: // input ");' –
Grab todo de una sola vez:
$contents = file_get_contents("php://stdin");
echo $contents;
Esto también funciona:
$data = stream_get_contents(STDIN);
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
- 1. de no bloqueo la entrada estándar en PHP CLI
- 2. Entrada repetida de entrada a una entrada estándar del proceso
- 3. no buffering entrada estándar lectura
- 4. lectura() desde la entrada estándar
- 5. Tomando la entrada de la entrada estándar después freopen()
- 6. Leer la entrada estándar para la entrada del usuario cuando ya hay un archivo redirigido a la entrada estándar
- 7. Navegador leyendo HTML desde la entrada estándar
- 8. Reencaminamiento entrada y salida estándar de C
- 9. Perl Padre IDE entrada estándar no funciona
- 10. Redirigir dos archivos a la entrada estándar
- 11. leer de la entrada estándar en C++
- 12. entrada estándar opcional en Python con argparse
- 13. Comprobación de entrada estándar en C#
- 14. cómo leer desde entrada estándar sin bloqueo?
- 15. Python lxml y la entrada estándar
- 16. Heroku empuje: gzip no entrada estándar en formato gzip
- 17. Cómo leer caracteres no ASCII de la entrada estándar CLI
- 18. aplicación symfony2, vagabundo & ant: stty: entrada estándar: argumento inválido
- 19. Dónde desinfectar PHP $ _POST [] entrada?
- 20. leer desde la entrada estándar de escritura a la salida estándar en C
- 21. Linux 3.0: Ejecutar proceso hijo con la entrada estándar entubada/salida estándar
- 22. ¿Hay algún marco estándar para php?
- 23. Cómo utilizar la salida estándar en php
- 24. PHP date_default_timezone_set() Hora Estándar del Este (EST)
- 25. ¿Cómo leer desde la entrada estándar línea por línea?
- 26. ¿Hay alguna manera de leer la entrada estándar con JavaScript?
- 27. corriente entrada estándar en un archivo por lotes
- 28. Delphi estándar de página de códigos de entrada y salida
- 29. Nombres estándar para los campos de entrada HTML
- 30. En Perl, ¿cómo determino si hay una entrada estándar presente?
También es posible usar la constante predefinida STDIN en lugar de abrirlo manualmente: Línea $ = fgets (stdin); – gix
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. –
@EricJ., Raro, ¿cómo sucedió eso? ¿Has 'fclose'' STDIN'? – Pacerier