Функция stream_select() получает массивы потоков и ждёт
изменения их статуса. Её работа эквивалентна работе функции
socket_select(), за исключением того, что она работает с потоками.
Список параметров
read
Потоки, перечисленные в массиве read будут отслеживаться на предмет
появления символов, доступных для чтения (точнее отслеживается, что чтение
не будет блокироваться - в частности, потоковый ресурс также готов для чтения в
конце файла, но в этом случае функция fread() будет возвращать
строку нулевой длины).
write
Потоки, перечисленные в массиве write, будут отслеживаться
на предмет того, что запись в них не будет блокироваться.
except
Потоки, перечисленные в массиве except, будут отслеживаться на предмет
поступления высокоприоритетных исключительных (внеполосных или "out-of-band") данных.
Замечание:
Когда stream_select() возвращается, массивы
read, write и
except изменяются для того, чтобы указать, какие потоковые
ресурсы на самом деле изменили статус.
Вам нет необходимости передавать каждый массив функции
stream_select(). Вы можете использовать вместо этого
пустые массивы или NULL. Также не забывайте, что эти массивы передаются
по ссылке и будут изменены после
выполнения функцииstream_select().
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 в цикле, так как
это заставит ваш скрипт потреблять слишком много процессорного времени.
Гораздо лучше указать значение тайм-аута в несколько секунд, хотя
если вам нужно проверять и одновременно запускать другой код, использование
тайм-аута как минимум 200000 микросекунд
поможет уменьшить использование процессорного времени вашим скриптом.
Запомните, что значение тайм-аута - это максимальное время, которое будет затрачено.
Функция stream_select() вернётся как только
запрошенные потоки будут готовы к использованию.
tv_usec
Смотрите описание параметра tv_sec.
Возвращаемые значения
В случае успеха функция stream_select() возвращает количество
потоковых ресурсов, содержащееся в изменённых массивах, которое может равно нулю, если
истёк тайм-аут до того, как произошло что-то интересное. В случае ошибки возвращается FALSE
и возникает предупреждение (это может случится, если системный вызов
прерывается входящим сигналом).
Примеры
Пример #1 Пример использованияstream_select()
Этот пример проверяет, что получены данные для чтения на потоках
$stream1 или $stream2.
Так как значение тайм-аута равно 0, функция возвратится
немедленно:
<?php /* Подготовить массив для чтения */ $read = array($stream1, $stream2); $write = NULL; $except = NULL; if (false === ($num_changed_streams = stream_select($read, $write, $except, 0))) { /* Обработка ошибок */ } elseif ($num_changed_streams > 0) { /* Как минимум на одном из потоков произошло что-то интересное */ } ?>
Примечания
Замечание:
По причине ограничения в текущем Zend Engine невозможно передать
постоянную NULL непосредственно как параметр в функцию,
которая ожидает, что этот параметр будет передан по ссылке. Вместо этого используйте
временную переменную или выражение, в котором крайний левый член будет
временной переменной:
<?php $e = NULL; stream_select($r, $w, $e, 0); ?>
Замечание:
Убедитесь, что используете оператор === при проверке на
ошибку. Так как функция stream_select() может возвращать 0,
сравнение с использованием == может возвращать TRUE:
<?php $e = NULL; if (false === stream_select($r, $w, $e, 0)) { echo "Произошла ошибка при вызове stream_select()\n"; } ?>
Замечание:
Если вы читаете/пишете в поток, возвращаемый в массивах, знайте, что
они не обязательно читают/пишут полное количество данных, которое вы
запросили. Будьте готовы к тому, чтобы иметь возможность читать/писать
даже по одному байту.
Замечание:
Некоторые потоки (например, zlib) не могут быть выбраны этой
функцией.
Замечание:
Совместимость с Windows: функция stream_select(), используемая на канале,
возвращённом из функции proc_open(), может вызвать потерю данных
под Windows 98.
Использование функции stream_select() на
файловых дескрипторах, возвращённых функцией proc_open() не удастся
и возвратит FALSE под Windows.