PHP的STDIN是阻塞操作,直接读取内容的话会造成阻塞.如下代码会一直运行直到有数据输入:

$data = stream_get_contents(STDIN);

按理可以通过声明stream_set_blocking(STDIN, FALSE)来操作:

stream_set_blocking(STDIN, FALSE);
$data = stream_get_contents(STDIN);

运行依旧不行,其实这是一个Bug,描述:https://bugs.php.net/bug.php?id=34972

通过测试发现,可用通过ftell函数获取STDIN文件句柄指针读/写的位置来判断.

if(ftell(STDIN)===0){
    $data = stream_get_contents(STDIN);
}