web-dev-qa-db-fra.com

PHP entrée standard?

Je sais que PHP est généralement utilisé pour le développement Web, où est aucune entrée standard, mais PHP prétend être utilisable comme langage de script à usage général, si vous suivez, c'est funky web conventions basées sur Je sais que PHP imprime dans stdout (ou comme vous voulez l'appeler) avec print et echo, ce qui est assez simple, mais je me demande comment un script PHP pourrait être alimenté par stdin avec fgetc(), mais toute fonction d’entrée est bonne), ou est-ce même possible?

47
Chris Lutz

Il est possible de lire la stdin en créant un handle de fichier avec php://stdin et de le lire ensuite avec fgets() pour une ligne par exemple (ou, comme vous l'avez déjà indiqué, fgetc() pour un seul caractère):

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

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

fclose( $f );
?>
67
Patrick Glandien

Lire de STDIN est méthode recommandée _

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

Pour éviter d'avoir à manipuler les poignées de fichiers, utilisez file_get_contents() et php://stdin:

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

(Si vous lisez une quantité vraiment énorme de données à partir de stdin, vous voudrez peut-être utiliser l'approche de traitement de fichier, mais cela devrait être bon pour plusieurs mégaoctets.)

14
mjs

Une méthode simple est 

$var = trim(fgets(STDIN));
11
Muhammad Usman

Vous pouvez utiliser fopen() sur php://stdin:

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

Prenez tout en un coup:

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

IIRC, vous pouvez également utiliser les éléments suivants:

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

Techniquement le même, mais un peu plus propre syntaxiquement.

5
Fritz H

Cela fonctionne aussi: 

$data = stream_get_contents(STDIN);
2
Richard Cross

Lors de l'utilisation de fgets, il est possible que les scripts bash bloquent, si la variable stdin n'est pas définie ou vide, y compris lors de l'utilisation de l'opérateur @php error control .

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

Ce comportement peut être évité en définissant stream_set_blocking sur l'en-tête 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
Cryptopat