Question

Je sais que PHP est généralement utilisé pour le développement web, où est pas d'entrée standard, mais PHP prétend être utilisable en tant que langage de script d'usage général, si vous suivez est branché sur le web conventions. Je sais que les impressions PHP à stdout (ou tout ce que vous voulez l'appeler) avec print et echo, ce qui est assez simple, mais je me demande comment un script PHP peut obtenir des commentaires de stdin (en particulier avec fgetc(), mais une fonction d'entrée est bon), ou est-ce encore possible?

Était-ce utile?

La solution

Il est possible de lire le stdin en créant un descripteur de fichier à php://stdin puis lire avec fgets() pour une ligne par exemple (ou, comme vous avez déjà dit, fgetc() pour un seul caractère):

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

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

fclose( $f );
?>

Autres conseils

Lecture de STDIN est méthode recommandée

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

Pour éviter d'avoir à mess avec handles 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 stdin vous voudrez peut-être utiliser l'approche filehandle, mais cela devrait être bon pour plusieurs méga-octets).

Une méthode simple est

$var = trim(fgets(STDIN));

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

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

Prenez tout en un seul coup:

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

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 syntaxe sage.

Cela fonctionne aussi:

$data = stream_get_contents(STDIN);

Lorsque vous utilisez fgets, il peut bloquer dans les scripts bash, si le stdin est pas défini ou vide, y compris en utilisant le @ opérateur de contrôle d'erreur php .

#!/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 mettant 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 
echo $pipe . "!";

A titre d'exemple, être appelé comme suit:

echo "Hello world" | ./myPHPscript
// Output "Hello world!"
./myPHPscript
// Output "!"
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top