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);
}