Entrada padrão do PHP?

Eu sei que o PHP é geralmente usado para o desenvolvimento da web, onde não é {[8] } nenhuma entrada padrão, mas o PHP afirma ser utilizável como uma linguagem de script de propósito geral, se você seguir as convenções baseadas na web. Eu sei que o PHP imprime para stdout (ou o que quer que lhe queiras chamar) com print e echo, o que é bastante simples, mas estou a pensar como é que um programa de PHP pode receber entrada de stdin (especificamente com fgetc(), mas qualquer função de entrada é boa), ou isto é mesmo possível?

Author: Chris Lutz, 2009-02-17

9 answers

É possível ler o stdin criando um identificador de arquivo para php://stdin e, em seguida, ler com fgets() para uma linha, por exemplo (ou, como você já disse, fgetc() para um único caractere):

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

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

fclose( $f );
?>
 65
Author: Patrick Glandien, 2012-07-28 20:19:14

A leitura de STDIN é a forma recomendada.

<?php
while (FALSE !== ($line = fgets(STDIN))) {
   echo $line;
}
?>
 36
Author: anatoly techtonik, 2010-12-17 23:22:17

Para evitar ter de mexer nos ficheiros, use file_get_contents() e php://stdin:

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

(Se você está lendo uma quantidade realmente enorme de dados de stdin você pode querer usar a abordagem filehandle, mas isso deve ser bom para muitos megabytes.)

 13
Author: mjs, 2012-02-27 12:09:19

Um método simples é

$var = trim(fgets(STDIN));
 11
Author: Muhammad Usman, 2013-10-30 02:50:54

Pode usar fopen() em php://stdin:

$f = fopen('php://stdin', 'r');
 8
Author: Greg, 2009-02-16 22:08:07

IIRC, também pode utilizar o seguinte:

$in = fopen(STDIN, "r");
$out = fopen(STDOUT, "w");
Tecnicamente é o mesmo, mas um pouco mais limpo em termos de sintaxe.
 5
Author: Fritz H, 2009-02-16 23:09:29
Agarra tudo de uma só vez.
$contents = file_get_contents("php://stdin");
echo $contents;
 5
Author: redolent, 2014-03-10 21:26:49

Isto também funciona:

$data = stream_get_contents(STDIN);
 2
Author: Richard Cross, 2015-08-14 12:58:32

Ao usar os fgets, poderá bloquear nos programas bash, se o stdin não estiver definido ou vazio, incluindo ao usar o @ operador de controlo de erros do php.

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

Este comportamento pode ser evitado definindo stream_set_blocking no cabeçalho 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 
 0
Author: Cryptopat, 2018-03-05 11:56:59