<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/ref.stream.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ru',
  ),
  'this' => 
  array (
    0 => 'function.stream-select.php',
    1 => 'stream_select',
    2 => 'Запускает эквивалент системного вызова select() на массивах
   потоков со временем ожидания в секундах и микросекундах',
  ),
  'up' => 
  array (
    0 => 'ref.stream.php',
    1 => 'Функции для работы с потоками',
  ),
  'prev' => 
  array (
    0 => 'function.stream-resolve-include-path.php',
    1 => 'stream_resolve_include_path',
  ),
  'next' => 
  array (
    0 => 'function.stream-set-blocking.php',
    1 => 'stream_set_blocking',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ru',
    'path' => 'reference/stream/functions/stream-select.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="function.stream-select" class="refentry">
 <div class="refnamediv">
  <h1 class="refname">stream_select</h1>
  <p class="verinfo">(PHP 4 &gt;= 4.3.0, PHP 5, PHP 7, PHP 8)</p><p class="refpurpose"><span class="refname">stream_select</span> &mdash; <span class="dc-title">
   Запускает эквивалент системного вызова select() на массивах
   потоков со временем ожидания в секундах и микросекундах
  </span></p>

 </div>
 <div class="refsect1 description" id="refsect1-function.stream-select-description">
  <h3 class="title">Описание</h3>
  <div class="methodsynopsis dc-description">
   <span class="methodname"><strong>stream_select</strong></span>(<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><span class="type"><a href="language.types.null.php" class="type null">?</a></span><span class="type"><a href="language.types.array.php" class="type array">array</a></span></span> <code class="parameter reference">&$read</code></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><span class="type"><a href="language.types.null.php" class="type null">?</a></span><span class="type"><a href="language.types.array.php" class="type array">array</a></span></span> <code class="parameter reference">&$write</code></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><span class="type"><a href="language.types.null.php" class="type null">?</a></span><span class="type"><a href="language.types.array.php" class="type array">array</a></span></span> <code class="parameter reference">&$except</code></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><span class="type"><a href="language.types.null.php" class="type null">?</a></span><span class="type"><a href="language.types.integer.php" class="type int">int</a></span></span> <code class="parameter">$seconds</code></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><span class="type"><a href="language.types.null.php" class="type null">?</a></span><span class="type"><a href="language.types.integer.php" class="type int">int</a></span></span> <code class="parameter">$microseconds</code><span class="initializer"> = <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong></span></span><br>): <span class="type"><span class="type"><a href="language.types.integer.php" class="type int">int</a></span>|<span class="type"><a href="language.types.singleton.php" class="type false">false</a></span></span></div>

  <p class="para rdfs-comment">
   Функция <span class="function"><strong>stream_select()</strong></span> принимает массивы потоков и ждёт
   изменения их статуса. Функция работает так же, как функции
   <span class="function"><a href="function.socket-select.php" class="function">socket_select()</a></span>, за исключением того, что она работает с потоками.
  </p>
 </div>


 <div class="refsect1 parameters" id="refsect1-function.stream-select-parameters">
  <h3 class="title">Список параметров</h3>
  <p class="para">
   <dl>
    
     <dt><code class="parameter">read</code></dt>
     <dd>
      <p class="para">
       Потоки массива <code class="parameter">read</code> будут отслеживаться,
       чтобы определить, не стали ли символы доступны для чтения (точнее, чтобы понять, не будет ли
       блокироваться чтение — в качестве конкретного примера, ресурс потока также готов для чтения в
       конце файла, но тогда функция <span class="function"><a href="function.fread.php" class="function">fread()</a></span> будет возвращать
       строку нулевой длины).
      </p>
     </dd>
    
    
     <dt><code class="parameter">write</code></dt>
     <dd>
      <p class="para">
       Потоки массива <code class="parameter">write</code> будут отслеживаться,
       чтобы определить, не будет ли блокироваться запись.
      </p>
     </dd>
    
    
     <dt><code class="parameter">except</code></dt>
     <dd>
      <p class="para">
       Потоки массива <code class="parameter">except</code> будут отслеживаться
       на предмет поступления высокоприоритетных исключительных (внеполосных, или «out-of-band») данных.
      </p>
      <blockquote class="note"><p><strong class="note">Замечание</strong>: 
       <p class="para">
        Когда функция <span class="function"><strong>stream_select()</strong></span> возвращает значение,
        массивы <code class="parameter">read</code>, <code class="parameter">write</code>
        и <code class="parameter">except</code> изменяются, чтобы указать, какие
        ресурсы потоков на самом деле изменили статус.
        Исходные ключи массивов (<span class="type"><a href="language.types.array.php" class="type array">array</a></span>) сохраняются.
       </p>
      </p></blockquote>
     </dd>
    
    
     <dt><code class="parameter">seconds</code></dt>
     <dd>
      <p class="para">
       Параметры <code class="parameter">seconds</code> и <code class="parameter">microseconds</code>
       складываются в параметр <em>timeout</em>,
       <code class="parameter">seconds</code> указывает количество секунд,
       а <code class="parameter">microseconds</code> — количество микросекунд.
       Параметр  <code class="parameter">timeout</code> — это верхняя граница времени,
       в течение которого функция <span class="function"><strong>stream_select()</strong></span> будет ждать,
       прежде чем вернёт результат.
       Функция <span class="function"><strong>stream_select()</strong></span> не будет ждать данные,
       если обоим параметрам — <code class="parameter">seconds</code>
       и <code class="parameter">microseconds</code> —
       установлено значение <code class="literal">0</code>, вместо этого функция вернёт
       результат немедленно, указывая текущий статус потоков.
      </p>
      <p class="para">
       Функция <span class="function"><strong>stream_select()</strong></span> блокируется на неопределённый срок,
       если значение параметра <code class="parameter">seconds</code> равно <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>.
       Функция возвращается только тогда, когда случается событие
       на отслеживаемом потоке, или если сигнал прерывает системный вызов.
      </p>
      <div class="warning"><strong class="warning">Внимание</strong>
       <p class="para">
        Разработчик может мгновенно опросить статус потоков,
        если установит значение времени ожидания равное <code class="literal">0</code>,
        однако, ПЛОХАЯ идея устанавливать значение времени ожидания <code class="literal">0</code> в цикле,
        поскольку тогда скрипт будет потреблять слишком много процессорного времени.
       </p>
       <p class="para">
        Лучше указать значение времени ожидания в несколько секунд, хотя,
        если нужно проверять и одновременно запускать другой код,
        установка для времени ожидания значения хотя бы в <code class="literal">200000</code> микросекунд
        поможет снизить нагрузку скрипта на процессор.
       </p>
       <p class="para">
        При работе с функцией помнят, что значение времени ожидания — это максимальное время,
        которое пройдёт; функция <span class="function"><strong>stream_select()</strong></span> вернёт значение, как только
        запрошенные потоки будут готовы к работе.
       </p>
      </div>
     </dd>
    
    
     <dt><code class="parameter">microseconds</code></dt>
     <dd>
      <p class="para">
       Смотрите описание параметра <code class="parameter">seconds</code>.
      </p>
     </dd>
    
   </dl>
  </p>
 </div>


 <div class="refsect1 returnvalues" id="refsect1-function.stream-select-returnvalues">
  <h3 class="title">Возвращаемые значения</h3>
  <p class="para">
   В случае успешного выполнения функция <span class="function"><strong>stream_select()</strong></span>
   возвращает количество ресурсов потоков, которые содержится
   в изменённых массивах. Значение будет равно нулю,
   если время ожидания закончилось до изменений.
   При ошибке функция возвращает <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>
   и выдаёт предупреждение — это случится, если системный вызов
   будет прерван входящим сигналом.
  </p>
 </div>


 <div class="refsect1 changelog" id="refsect1-function.stream-select-changelog">
  <h3 class="title">Список изменений</h3>
  <table class="doctable informaltable">
   
    <thead>
     <tr>
      <th>Версия</th>
      <th>Описание</th>
     </tr>

    </thead>

    <tbody class="tbody">
     <tr>
      <td>8.1.0</td>
      <td>
       Параметр <code class="parameter">microseconds</code> теперь принимает значение <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>.
      </td>
     </tr>

    </tbody>
   
  </table>

 </div>


 <div class="refsect1 examples" id="refsect1-function.stream-select-examples">
  <h3 class="title">Примеры</h3>
  <p class="para">
   <div class="example" id="example-1">
    <p><strong>Пример #1 Пример использования функции <span class="function"><strong>stream_select()</strong></span></strong></p>
    <div class="example-contents"><p>
     Этот пример проверяет, что получены данные для чтения на потоках
     <code class="parameter">$stream1</code> или <code class="parameter">$stream2</code>.
     Поскольку значение времени ожидания равно <code class="literal">0</code>, функция возвратится
     немедленно:
    </p></div>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #FF8000">/* Подготовить массив для чтения */<br /></span><span style="color: #0000BB">$read   </span><span style="color: #007700">= array(</span><span style="color: #0000BB">$stream1</span><span style="color: #007700">, </span><span style="color: #0000BB">$stream2</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$write  </span><span style="color: #007700">= </span><span style="color: #0000BB">NULL</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$except </span><span style="color: #007700">= </span><span style="color: #0000BB">NULL</span><span style="color: #007700">;<br /><br />if (</span><span style="color: #0000BB">false </span><span style="color: #007700">=== (</span><span style="color: #0000BB">$num_changed_streams </span><span style="color: #007700">= </span><span style="color: #0000BB">stream_select</span><span style="color: #007700">(</span><span style="color: #0000BB">$read</span><span style="color: #007700">, </span><span style="color: #0000BB">$write</span><span style="color: #007700">, </span><span style="color: #0000BB">$except</span><span style="color: #007700">, </span><span style="color: #0000BB">0</span><span style="color: #007700">))) {<br />    </span><span style="color: #FF8000">/* Обработка ошибок */<br /></span><span style="color: #007700">} elseif (</span><span style="color: #0000BB">$num_changed_streams </span><span style="color: #007700">&gt; </span><span style="color: #0000BB">0</span><span style="color: #007700">) {<br />    </span><span style="color: #FF8000">/* Как минимум на одном из потоков произошли изменения */<br /></span><span style="color: #007700">}<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
  </p>
 </div>


 <div class="refsect1 notes" id="refsect1-function.stream-select-notes">
  <h3 class="title">Примечания</h3>
  <blockquote class="note"><p><strong class="note">Замечание</strong>: 
   <p class="para">
    Из-за ограничений движка Zend Engine невозможно передать
    модификатор константы, например, значение <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>,
    в качестве параметра функции, которая ожидает, что этот параметр
    передадут по ссылке. Вместо этого объявляют временную переменную
    или записывают выражение с крайним левым членом в качестве временной переменной:
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$e </span><span style="color: #007700">= </span><span style="color: #0000BB">NULL</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">stream_select</span><span style="color: #007700">(</span><span style="color: #0000BB">$r</span><span style="color: #007700">, </span><span style="color: #0000BB">$w</span><span style="color: #007700">, </span><span style="color: #0000BB">$e</span><span style="color: #007700">, </span><span style="color: #0000BB">0</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   </p>
  </p></blockquote>
  <blockquote class="note"><p><strong class="note">Замечание</strong>: 
   <p class="para">
   Ошибку проверяют оператором строгого сравнения <code class="literal">===</code>.
   Иногда функция <span class="function"><strong>stream_select()</strong></span> возвращает значение 0,
   и сравнение через оператор <code class="literal">==</code> вычислится как <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>:
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$e </span><span style="color: #007700">= </span><span style="color: #0000BB">NULL</span><span style="color: #007700">;<br />if (</span><span style="color: #0000BB">false </span><span style="color: #007700">=== </span><span style="color: #0000BB">stream_select</span><span style="color: #007700">(</span><span style="color: #0000BB">$r</span><span style="color: #007700">, </span><span style="color: #0000BB">$w</span><span style="color: #007700">, </span><span style="color: #0000BB">$e</span><span style="color: #007700">, </span><span style="color: #0000BB">0</span><span style="color: #007700">)) {<br />    echo </span><span style="color: #DD0000">"Произошла ошибка при вызове функции stream_select()\n"</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   </p>
  </p></blockquote>
  <blockquote class="note"><p><strong class="note">Замечание</strong>: 
   <p class="para">
    При чтении или записи в поток, который возвращается в массивах, учитывают,
    что поток читает или записывает не полный объём данных,
    которые запросили. Разработчику лучше быть готовым даже к тому,
    что получится читать или записывать только один байт.
   </p>
  </p></blockquote>
  <blockquote class="note"><p><strong class="note">Замечание</strong>: 
   <p class="para">
    Ряд потоков нельзя выбрать этой функцией, например, поток модуля <code class="literal">zlib</code>.
   </p>
  </p></blockquote>
  <blockquote class="note"><p><strong class="note">Замечание</strong>: 
   <strong>Совместимость с операционной системой Windows</strong><br />
   <p class="para">
    Вызов функции <span class="function"><strong>stream_select()</strong></span>
    на файловых дескрипторах, которые возвращает функция
    <span class="function"><a href="function.proc-open.php" class="function">proc_open()</a></span> в системах Windows,
    завершится ошибкой и вернёт <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>.
   </p>
   <p class="para">
    При запуске из консоли константа <strong><code><a href="reserved.constants.php#constant.stdin">STDIN</a></code></strong> изменяет статус,
    как только становятся доступны <em>какие угодно</em>
    входные события, но процесс по-прежнему может блокировать чтение из потока.
   </p>
  </p></blockquote>
 </div>


 <div class="refsect1 seealso" id="refsect1-function.stream-select-seealso">
  <h3 class="title">Смотрите также</h3>
  <ul class="simplelist">
   <li><span class="function"><a href="function.stream-set-blocking.php" class="function" rel="rdfs-seeAlso">stream_set_blocking()</a> - Устанавливает блокирующий или неблокирующий режим для потока</span></li>
  </ul>
 </div>

</div><?php manual_footer($setup); ?>