问题
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?
回答1:
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 );
?>
回答2:
Reading from STDIN is recommended way
<?php
while (FALSE !== ($line = fgets(STDIN))) {
echo $line;
}
?>
回答3:
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.)
回答4:
A simple method is
$var = trim(fgets(STDIN));
回答5:
You can use fopen() on php://stdin:
$f = fopen('php://stdin', 'r');
回答6:
Grab it all in one shot:
$contents = file_get_contents("php://stdin");
echo $contents;
回答7:
IIRC, you may also use the following:
$in = fopen(STDIN, "r");
$out = fopen(STDOUT, "w");
Technically the same, but a little cleaner syntax-wise.
回答8:
This also works:
$data = stream_get_contents(STDIN);
回答9:
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 "!"
回答10:
Instead of manually opening STDIN stream, use built in readline() function if you just want to read a single line without too much a hassle :
<?php
$age= readline("Enter your age: ");
echo "Your age is : ".$age;
PHP documentation is your friend : https://www.php.net/manual/en/function.readline.php
来源:https://stackoverflow.com/questions/554760/php-standard-input