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?
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 );
?>
Lire de STDIN est méthode recommandée _
<?php
while (FALSE !== ($line = fgets(STDIN))) {
echo $line;
}
?>
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.)
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 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 syntaxiquement.
Cela fonctionne aussi:
$data = stream_get_contents(STDIN);
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