Help us understand the problem. What is going on with this article?

file_get_contents('php://stdin') で、標準入力を渡さないとどうなるか。

ハマったこと

PHPの入出力ストリームラッパーを使って、標準入力を受け取る場合。(手元のPHP7.1で動作確認)
https://www.php.net/manual/ja/wrappers.php.php

たとえばこんなスクリプトで

<?php
$str = file_get_contents('php://stdin');
echo $str;

標準入力を渡すと、その文字列をそのまま表示します。

$ echo 'hoge' | php test.php 
hoge

では、このスクリプトに標準入力を渡さなかった場合どうなるでしょう?

$ php test.php 

空の文字列でも帰ってくるのかなと思ってたのですが。。。
実は、 処理が止まってプロンプトが帰ってきません
(正確には、パイプを渡してない時は標準入力が入力待ちになってブロックされている)

対処策

posix_isatty() 関数を利用します。
http://php.net/manual/ja/function.posix-isatty.php

この関数を使って、 STDINがオープンされていて、 かつ端末に接続されているか否かを判定します。
(標準入力が渡っている場合はfalseになる)

<?php
$str = (posix_isatty(STDIN)) ? 'default' : file_get_contents('php://stdin');
echo $str;

動作検証

$ echo 'hoge' | php test.php 
hoge

$ php test.php 
default
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away