socket_select
Запускает системный вызов select() для заданных массивов сокетов с указанным временем ожидания
&reftitle.description;
intfalsesocket_select
arraynullread
arraynullwrite
arraynullexcept
intnullseconds
intmicroseconds0
socket_select принимает массивы сокетов и ждёт
их изменения статуса. Те, кто знаком с сокетами BSD, обнаружат, что
массивы сокетов на самом деле являются так называемыми наборами
дескрипторов файлов. Наблюдаются три независимых массива ресурсов сокетов.
&reftitle.parameters;
read
Сокеты, перечисленные в массиве read будут
наблюдаться для просмотра, есть ли доступные символы для чтения (
точнее, чтобы видеть, не будет ли чтение блокироваться, в частности,
сокет уже достиг конца файла, и в этом случае
socket_read вернёт строку с нулевой длиной).
write
Сокеты, перечисленные в массиве write будут
наблюдаться для просмотра, не будет ли запись блокироваться.
except
Сокеты, перечисленные в массиве except будут
наблюдаться для исключений.
seconds
seconds и microseconds
вместе образуют параметр timeout. Параметр
timeout - максимальный промежуток времени до возврата
socket_select.
seconds может быть нулём, заставляя
socket_select к немедленному возврату. Это полезно для
опроса. Если seconds равен &null; (нет времени ожидания),
socket_select может блокироваться бесконечно.
microseconds
При завершении массивы изменяются для обозначения, какой сокет
на самом деле изменил статус.
Не требуется передавать каждый массив в
socket_select. Вы можете пропустить его и использовать
пустой массив или &null; вместо этого. Также не забывайте, что эти массивы
передаются по ссылке и будут изменены после завершения
socket_select.
Из-за ограничения текущего движка Zend невозможно передать модификатор
константы, такой как &null;, непосредственно в качестве параметра в функцию,
которая ожидает, что этот параметр будет передан по ссылке. Вместо этого используйте
временную переменную или выражение, где левая сторона является временной переменной:
Использование &null; в socket_select
]]>
&reftitle.returnvalues;
В случае успешного выполнения socket_select возвращает количество
сокетов, содержащихся в изменённых массивах, которое может быть равно нулю,
если время ожидания истечёт до того, как произойдёт что-то интересное. В случае возникновения ошибки возвращается &false;.
Код ошибки может быть получен с помощью
socket_last_error.
Обязательно используйте оператор === при проверке
на ошибку. Поскольку socket_select может возвращать 0,
сравнение с == будет оцениваться как &true;:
Анализ результата socket_select
]]>
&reftitle.examples;
Пример использования socket_select
0) {
/* По крайней мере, в одном из сокетов произошло что-то интересное */
}
?>
]]>
&reftitle.notes;
Имейте в виду, что некоторые реализации сокетов необходимо обрабатывать
очень осторожно. Несколько основных правил:
Вы всегда должны попытаться использовать socket_select
без времени ожидания. Ваша программа ничего не должна делать, если нет доступных
данных. Код, зависящий от времени ожидания, обычно не очень переносим и
труден для отладки.
Сокет не должен добавляться к любому из массивов, если вы не собираетесь
проверять результат после вызова socket_select.
После возврата socket_select
все сокеты во всех массивах должны быть проверены. Любой
сокет, доступный для записи или чтения, должен использоваться для записи или чтения.
Если вы читаете или записываете из сокета, возвращаемого в массивах, имейте в виду,
что он необязательно сможет прочитать или записать полностью запрашиваемые вами
данные. Будьте готовы прочитать или записать только один байт.
Обычно для большинства реализаций сокетов единственное исключение, пойманное
с помощью массива except - это данные без привязки,
полученные в сокете.
&reftitle.seealso;
socket_read
socket_write
socket_last_error
socket_strerror