stream_select
select() システムコールと同等の操作を、
ストリームの配列に対して seconds と microseconds で指定されたタイムアウト時間をもって行う
説明
intfalse stream_select(
arraynull &$read
,
arraynull &$write
,
arraynull &$except
,
intnull $seconds
,
intnull $microseconds
= null
)
パラメータ
-
read
-
read
配列に列挙されたストリームに対しては、
何らかのデータがそのストリーム内で読み出せる状態にあるかどうか
監視が行われます
(より正確にいえば、ブロックしないで読み出せる状態かどうか -
特にストリームが EOF に達したかどうか、です。このとき、
fread は長さ 0 の文字列を返します)。
-
write
-
write
配列に列挙されたストリームに対しては、
ブロックしないで書き込みができるかどうかの監視が行われます。
-
except
-
except
配列に列挙されたストリームに対しては、
重大な例外("帯域外の")データが発生したかどうかの監視が行われます。
注意:
stream_select の終了時には、
どのストリームの状態が実際に変化したのかが分かるよう、
配列 read
、write
および
except
に変更が加えられます。
但し、配列のキーは保存されます。
-
seconds
-
seconds
と microseconds
は、一体となって、timeout パラメータを表現します。
seconds
は秒数を指定し、一方
microseconds
はマイクロ秒数を指定します。
timeout は、stream_select
の実行から戻るまでの時間の上限です。
seconds
および microseconds
の両方に 0
を指定すると
stream_select はデータを待たずに一瞬で戻ります。
これは現在のストリームの状態を示します。
seconds
が null
(タイムアウトなし) の場合、
stream_select はブロックしつづけ、調べている
ストリームのひとつでイベントが発生する(あるいはシグナルがシステム
コールを中断する)まで終了しません。
警告
タイムアウト値に 0
を指定すると、ストリームの
状態を即時に取得することが可能です。しかし、ループ内でタイムアウト
0
を指定するのは良い考えではありません。
そうすると大量の CPU 時間を消費してしまいます。
タイムアウト値を数秒にするとかなりましになります。しかし、どうしても
他のコードを同時に実行させながらチェックをする必要がある場合には、
少なくとも 200000
マイクロ秒以上のタイムアウトを
設定するようにしましょう。これであなたのスクリプトの CPU 使用量を
抑えることができます。
タイムアウト値は、あくまでも経過時間の最大値であることを覚えておきましょう。
stream_select は、指定したストリームが使用可能に
なるとすぐに結果を返します。
-
microseconds
-
seconds
の説明を参照ください。
戻り値
成功した場合 stream_select は、変更された
配列に何個のストリームリソースが格納されたかを示す数を返します。
もしタイムアウトの時間内に何も規定された事象が起こらなかった場合は
0 になることもあります。エラーの際は false
を返し、警告を発生させます
(システムコールが別のシグナルによって中断された場合などに起こりえます)。
例
例1 stream_select の例
この例では、$stream1
あるいは
$stream2
のどちらかに読み込めるデータが
到達したかどうかを調べます。
タイムアウトが 0
なので、すぐに結果を返します。
<?php
/* read 配列を用意 */
$read = array($stream1, $stream2);
$write = NULL;
$except = NULL;
if (false === ($num_changed_streams = stream_select($read, $write, $except, 0))) {
/* エラー処理 */
} elseif ($num_changed_streams > 0) {
/* 少なくとも 1 つのストリームに何らかの事象が起こりました。*/
}
?>
注意
注意:
現在の Zend Engine の実装上の制約により、null
のような定数を
この関数の参照渡しが行われるパラメータに直接指定することはできません。
代わりに一時的な変数を指定するか、一番左の変数が一時的な変数になるような
式を指定してください:
<?php
$e = NULL;
stream_select($r, $w, $e, 0);
?>
注意:
エラーかどうかをチェックするには ===
を使ってください。
stream_select は 0 を返すことがあるため、その場合
false
と ==
演算子で比較すると true
と評価されてしまうからです:
<?php
$e = NULL;
if (false === stream_select($r, $w, $e, 0)) {
echo "stream_select() に失敗しました\n";
}
?>
注意:
配列に返されたストリームに対して読み込みまたは書き込み操作を行う際に、
必ずしもあなたの希望しただけデータが読まれたり書かれたりはしないことに
注意してください。たった 1 バイトしか読み出せない場合も、書き込めない
場合もあるのです。
注意:
ストリームの中には、(zlib
などのように)
この関数で select できないものもあります。
注意:
Windows の互換性
Windows では、proc_open が返すファイル記述子に
対して stream_select を使用すると
失敗して false
を返すことがあります。
あらゆる 入力イベントが利用可能になるとすぐに、
コンソールからの STDIN
の状態も変化しますが、
ストリームからの読み出しはブロックされたままかもしれません。