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?
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 "!"