2009-02-16 7 views
44

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 un langage de script général, si vous suivez ses conventions Web funky. Je sais que PHP imprime à 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 une entrée de stdin (en particulier avec fgetc(), mais toute fonction d'entrée est bien), ou est-ce même possible?Entrée standard PHP?

Répondre

64

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à a déclaré, fgetc() pour un seul caractère):

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

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

fclose($f); 
?> 
+21

Vous pouvez également utiliser le lieu prédéfini STDIN constante d'ouvrir manuellement: ligne $ = fgets (stdin); – gix

+2

STDIN ne fonctionnait pas pour moi, mais 'php: // stdin', 'r' l'a fait. En utilisant PHP 5.2.9-2 (cli) (construit: 9 avril 2009 08:23:19) sur Vista. –

+0

@EricJ., Bizarre, comment est-ce arrivé? Avez-vous '' fclose'' 'STDIN'? – Pacerier

8

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

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

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

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

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

+1

Cela devrait être un commentaire –

36

lecture de STDIN est recommended way

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

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 les données de stdin vous pourriez vouloir utiliser l'approche de filehandle, mais cela devrait être bon pour plusieurs mégaoctets.)

+1

'file_get_contents' .... donnera un aussi gros problème que l'énormité du fichier. – Pacerier

11

Une méthode simple est

$var = trim(fgets(STDIN)); 
+2

Aussi, nous pouvons utiliser '$ contents = file_get_contents (" php: // input ");' –

5

Prenez tout en un seul coup:

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

Cela fonctionne aussi:

$data = stream_get_contents(STDIN); 
0

Lorsque vous utilisez fgets, il peut bloquer dans les scripts bash, si le stdin n'est pas défini ou vide, y compris lors de l'utilisation du @php error control operator.

#!/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