Question

I know PHP is usually used for web development, where there is no standard input, but PHP claims to be usable as a general-purpose scripting language, if you do follow it's funky web-based conventions. I know that PHP prints to stdout (or whatever you want to call it) with print and echo, which is simple enough, but I'm wondering how a PHP script might get input from stdin (specifically with fgetc(), but any input function is good), or is this even possible?

Was it helpful?

Solution

It is possible to read the stdin by creating a file handle to php://stdin and then read from it with fgets() for a line for example (or, as you already stated, fgetc() for a single character):

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

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

fclose( $f );
?>

OTHER TIPS

Reading from STDIN is recommended way

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

To avoid having to mess around with filehandles, use file_get_contents() and php://stdin:

$ echo 'Hello, World!' | php -r 'echo file_get_contents("php://stdin");'
Hello, World!

(If you're reading a truly huge amount of data from stdin you might want to use the filehandle approach, but this should be good for many megabytes.)

A simple method is

$var = trim(fgets(STDIN));

You can use fopen() on php://stdin:

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

Grab it all in one shot:

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

IIRC, you may also use the following:

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

Technically the same, but a little cleaner syntax-wise.

This also works:

$data = stream_get_contents(STDIN);

When using fgets, it may block in bash scripts, if the stdin isn't set or empty, including while using the @ php error control operator.

#!/usr/bin/php
<?php
$pipe = @trim(fgets(STDIN));
// Script was called with an empty stdin
// Fail to continue, php warning 

This behavior can be avoided by setting stream_set_blocking on the php header:

#!/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 . "!";

As example, to be called as follow:

echo "Hello world" | ./myPHPscript
// Output "Hello world!"
./myPHPscript
// Output "!"
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top