Domanda
Lo so PHP è di solito utilizzato per lo sviluppo web, dove è alcun input standard, ma PHP sostiene di essere utilizzabile come un linguaggio di scripting general-purpose, se non seguite è funky web-based convegni. So che le stampe PHP per stdout
(o come volete chiamarlo) con print
e echo
, che è abbastanza semplice, ma mi chiedo come uno script PHP potrebbe ottenere input da stdin
(in particolare con fgetc()
, ma qualsiasi funzione di ingresso è bene), oppure è anche possibile?
Soluzione
E 'possibile leggere la stdin
con la creazione di un handle di file per php://stdin
e poi leggere da esso con fgets()
per una linea, ad esempio (o, come si è già detto, fgetc()
di un singolo carattere):
<?php
$f = fopen( 'php://stdin', 'r' );
while( $line = fgets( $f ) ) {
echo $line;
}
fclose( $f );
?>
Altri suggerimenti
La lettura da STDIN modo consigliato
<?php
while (FALSE !== ($line = fgets(STDIN))) {
echo $line;
}
?>
Per evitare di dover pasticciare con filehandle, utilizzare file_get_contents()
e php://stdin
:
$ echo 'Hello, World!' | php -r 'echo file_get_contents("php://stdin");'
Hello, World!
(Se state leggendo un vero e un'enorme quantità di dati da stdin
si potrebbe desiderare di utilizzare l'approccio filehandle, ma questo dovrebbe essere un bene per molti megabyte.)
Un metodo semplice è
$var = trim(fgets(STDIN));
È possibile utilizzare fopen()
su php://stdin
:
$f = fopen('php://stdin', 'r');
Prendi tutto in un solo colpo:
$contents = file_get_contents("php://stdin");
echo $contents;
IIRC, si può anche utilizzare il seguente:
$in = fopen(STDIN, "r");
$out = fopen(STDOUT, "w");
Tecnicamente lo stesso, ma un po 'più pulito sintassi-saggio.
Questo funziona anche:
$data = stream_get_contents(STDIN);
Quando si usa fgets, si può bloccare in script bash, se il stdin
non è impostata o vuota, compreso mentre utilizzando il @
php operatore di controllo dell'errore .
#!/usr/bin/php
<?php
$pipe = @trim(fgets(STDIN));
// Script was called with an empty stdin
// Fail to continue, php warning
Questo comportamento può essere evitato impostando stream_set_blocking
sull'intestazione 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 titolo di esempio, di essere chiamato come segue:
echo "Hello world" | ./myPHPscript
// Output "Hello world!"
./myPHPscript
// Output "!"