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?

È stato utile?

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 "!"
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top