stream_select - Ошибка
Вернуться к: Функции для работы с потоками
stream_select
(PHP 4 >= 4.3.0, PHP 5, PHP 7)
stream_select — Запускает эквивалент системного вызова select() на заданных массивах потоков с таймаутом, указанным параметрами tv_sec и tv_usec
Описание
&$read
, array &$write
, array &$except
, int $tv_sec
[, int $tv_usec
= 0
] )Функция stream_select() получает массивы потоков и ждёт изменения их статуса. Её работа эквивалентна работе функции socket_select(), за исключением того, что она работает с потоками.
Список параметров
-
read
-
Потоки, перечисленные в массиве
read
будут отслеживаться на предмет появления символов, доступных для чтения (точнее отслеживается, что чтение не будет блокироваться - в частности, потоковый ресурс также готов для чтения в конце файла, но в этом случае функция fread() будет возвращать строку нулевой длины). -
write
-
Потоки, перечисленные в массиве
write
, будут отслеживаться на предмет того, что запись в них не будет блокироваться. -
except
-
Потоки, перечисленные в массиве
except
, будут отслеживаться на предмет поступления высокоприоритетных исключительных (внеполосных или "out-of-band") данных.
Вам нет необходимости передавать каждый массив функции stream_select(). Вы можете использовать вместо этого пустые массивы илиЗамечание:
Когда stream_select() возвращается, массивы
read
,write
иexcept
изменяются для того, чтобы указать, какие потоковые ресурсы на самом деле изменили статус.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.
Смотрите также
- stream_set_blocking() - Устанавливает блокирующий/неблокирующий режим на потоке
Вернуться к: Функции для работы с потоками