非ブロッキングであるPHPでSTDIN
から読み取るためにとにかくがあります:PHP CLIでSTDINにノンブロッキング
私はこの試みた:
stream_set_blocking(STDIN, false);
echo fread(STDIN, 1);
と、この:
$stdin = fopen('php://stdin', 'r');
stream_set_blocking($stdin, false);
echo 'Press enter to force run command...' . PHP_EOL;
echo fread($stdin, 1);
をそれでもブロックするとfread
がデータを取得します。
これは(7歳)に関するいくつかのオープンなバグレポートに気づきました。それでできない場合は、これを達成できる粗末なハッキングを誰かが知っていますか?
- https://bugs.php.net/bug.php?id=34972
- https://bugs.php.net/bug.php?id=47893
- https://bugs.php.net/bug.php?id=48684
ノンブロッキングの動作を理解しているかどうかわかりません。 stdinへの入力を待機するものがない場合、 'fread()'はFALSEを返しますか?どのようにそれをEOFと区別するのでしょうか?記述的な失敗がないので、stdinで待機中のデータがあるかどうかを判断するためには、fread()以外のテスト*その他*が必要です。 – Graham
@Graham 'fread'は、入力がSTDINに渡されるまで、スクリプトの実行を一時停止します。基本的に私が望むのは、 'STDIN'へのユーザ入力があるかどうかをチェックし、そうでなければ続行するか、他のものを実行することです。 – Petah
@Graham "非ブロック"とは、データの量を読み込めなかったとしても(2番目の引数)、それより少ないデータを読み込むことができる 'fread()'を即座に返さなければならないことを意味します。この場合、空の文字列を返す必要があります。 @Petahは 'fopen( 'php:// stdin)'を試しましたか?ぼんやりと覚えています。以前は「STDIN」の問題がありました。 – KingCrunch