関数・クラス解説

stream_select

version:PHP 4 >= 4.3.0, PHP 5, PHP 7 (公式)

select() システムコールと同等の操作を、 ストリームの配列に対して tv_sec と tv_usec で指定されたタイムアウト時間をもって行う

公式リファレンス

書式

stream_select ( array &$read , array &$write , array &$except , int $tv_sec [, int $tv_usec = 0 ] ) : int

説明

stream_select() はストリームの配列を受け取ると、 それらの状態が変化するまで待ちます。機能としては、ストリームに対して 働くという点以外では socket_select() と同一です。

パラメータ

read
read 配列に列挙されたストリームに対しては、 何らかのデータがそのストリーム内で読み出せる状態にあるかどうか 監視が行われます (より正確にいえば、ブロックしないで読み出せる状態かどうか - 特にストリームが EOF に達したかどうか、です。このとき、 fread() は長さ 0 の文字列を返します)。
write
write 配列に列挙されたストリームに対しては、 ブロックしないで書き込みができるかどうかの監視が行われます。
except
except 配列に列挙されたストリームに対しては、 重大な例外("帯域外の")データが発生したかどうかの監視が行われます。
注意: stream_select() の終了時には、 どのストリームの状態が実際に変化したのかが分かるよう、 配列 read、write および except に変更が加えられます。 但し、配列のキーは保存されます。
tv_sec
tv_sec と tv_usec は、一体となって、timeout パラメータを表現します。 tv_sec は秒数を指定し、一方 tv_usec はマイクロ秒数を指定します。 timeout は、stream_select() の実行から戻るまでの時間の上限です。 tv_sec および tv_usec の両方に 0 を指定すると stream_select() はデータを待たずに一瞬で戻ります。 これは現在のストリームの状態を示します。 tv_sec が NULL (タイムアウトなし) の場合、 stream_select() はブロックしつづけ、調べている ストリームのひとつでイベントが発生する(あるいはシグナルがシステム コールを中断する)まで終了しません。
警告 タイムアウト値に 0 を指定すると、ストリームの 状態を即時に取得することが可能です。しかし、ループ内でタイムアウト 0 を指定するのは良い考えではありません。 そうすると大量の CPU 時間を消費してしまいます。 タイムアウト値を数秒にするとかなりましになります。しかし、どうしても 他のコードを同時に実行させながらチェックをする必要がある場合には、 少なくとも 200000 マイクロ秒以上のタイムアウトを 設定するようにしましょう。これであなたのスクリプトの CPU 使用量を 抑えることができます。 タイムアウト値は、あくまでも経過時間の最大値であることを覚えておきましょう。 stream_select() は、指定したストリームが使用可能に なるとすぐに結果を返します。
tv_usec
tv_sec の説明を参照ください。

返値

成功した場合 stream_select() は、変更された 配列に何個のストリームリソースが格納されたかを示す数を返します。 もしタイムアウトの時間内に何も規定された事象が起こらなかった場合は 0 になることもあります。エラーの際は FALSE を返し、警告を発生させます (システムコールが別のシグナルによって中断された場合などに起こりえます)。

注意

注意: 現在の 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 の状態も変化しますが、 ストリームからの読み出しはブロックされたままかもしれません。
警告 タイムアウト値に 0 を指定すると、ストリームの 状態を即時に取得することが可能です。しかし、ループ内でタイムアウト 0 を指定するのは良い考えではありません。 そうすると大量の CPU 時間を消費してしまいます。 タイムアウト値を数秒にするとかなりましになります。しかし、どうしても 他のコードを同時に実行させながらチェックをする必要がある場合には、 少なくとも 200000 マイクロ秒以上のタイムアウトを 設定するようにしましょう。これであなたのスクリプトの CPU 使用量を 抑えることができます。 タイムアウト値は、あくまでも経過時間の最大値であることを覚えておきましょう。 stream_select() は、指定したストリームが使用可能に なるとすぐに結果を返します。

サンプル

例1 stream_select() の例

この例では、$stream1 あるいは $stream2 のどちらかに読み込めるデータが 到達したかどうかを調べます。 タイムアウトが 0 なので、すぐに結果を返します。

/* 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 つのストリームに何らかの事象が起こりました。*/ }

参考

  • stream_set_blocking() - ストリームのブロックモードを有効にする / 解除する
  • ワード検索


    ※入力キーワードが、関数名・説明文・タグに含まれるものを検索

    関数名アルファベット別

    A B C D E F G H I J
    K L M N O P Q R S T
    U V W X Y Z _

    最終更新一覧

    stristr
     大文字小文字を区別せず文字列を検索し、ヒット箇所以降(あるいは以前)の文字列を返却

    stripslashes
     バックスラッシュでエスケープされた文字列から、バックスラッシュを取り除く

    stripos
     大文字小文字を区別せずに文字列が最初に現れる位置を取得する

    stripcslashes
     addcslashes() でクォートされた文字列をアンクォートする

    strip_tags
     文字列から HTML と PHP のタグを除去して返却

    strcspn
     指定した文字が最初に現れる位置を調べる

    strcoll
     ロケールに基づいて2つの文字列を比較し同じか(あるいは大小)を判定する

    strcmp
     2つの文字列を比較し同じか(あるいは大小)を判定する

    strchr
     strstr() のエイリアス

    strcasecmp
     2つの文字列を比較(大文字小文字を区別せず同じとみなす)

    カテゴリー一覧

    PHP の振る舞いの変更
    音声フォーマットの操作
    認証サービス
    コマンドライン関連
    圧縮およびアーカイブ
    暗号
    データベース関連
    日付および時刻関連
    ファイルシステム
    自然言語および文字エンコーディング
    画像処理および作成
    メール関連
    数学
    テキスト以外の MIME 型
    プロセス制御
    その他の基本モジュール
    その他のサービス
    検索エンジン用の拡張モジュール
    サーバー固有のモジュール
    セッション関連
    テキスト処理
    変数・データ型関連
    ウェブサービス
    Windows 用のモジュール
    XML 操作
    GUI用の拡張モジュール