socket_select(PHP 4 >= 4.1.0) socket_select - запускает системный вызов select() на данных массивах сокетов с таймаутом, специфицированным параметрами tv_sec и tv_usec. Описаниеint socket_select (resource &read, resource &write, resource &except, int tv_sec [, int tv_usec])
socket_select() принимает массивы сокетов и ожидает их для изменения статуса. Сокеты, приходящие из BSD, будут распознаваться как так называемые наборы дескрипторов файлов. Ожидаются три массива ресурсов сокетов. Сокеты массива read будут ожидаться, чтобы просмотреть, становятся ли символы доступными для чтения (точнее, чтобы просмотреть, не будет ли блокировано чтение; ресурс сокета готов также и в end-of-file, и в этом случае socket_read() возвратит строку нулевой длины). Сокеты из массива write будут ожидаться, чтобы просмотреть, не будет блокировано ли чтение. Сокеты из массива except ожидаются для исключений.
Вам не нужно передавать каждый массив в socket_select(). Вместо них вы можете использовать пустой массив или NULL. Не забывайте также, что эти массивы передаются по сылке и будут модифицированы после возвращения из socket_select(). Пример:
Параметры tv_sec и tv_usec - оба из параметра timeout. Этот timeout является верхней границей времени, прошедшего до возврата из socket_select(). tv_sec может быть 0, вызывая немедленный возврат из socket_select(). Это используется для пулов. Если tv_sec равен NULL (нет таймаута), socket_select() может блокировать бесконечно. При успехе socket_select() возвращает количество ресурсов сокетов, содержащихся в модифицированных массивах, которое может быть равно 0, если timeout истёк до возникновения чего-нибудь интересного. При ошибке возвращается FALSE. Код ошибки можно запросить функцией socket_last_error().
См. также socket_read(), socket_write(), socket_last_error() и socket_strerror(). |
||||||||||
|
||||||||||
И при минимальном, и при максимальном количестве повторений, неудача того, что идёт следом, нормально вызывает повторное вычисление повторяемого элемента, с целью проверить, не даст ли совпадения повторение, иное количество раз, оставшейся части патэрна. Иногда нужно предотвратить это для изменения природы совпадения, либо чтобы вызвать неудачу раньше, чем это могло бы быть, если автор патэрна знает, что больше нет точек для работы.
Рассмотрим, например, патэрн \d+foo в применении к строке-субъекту
123456bar
После совпадения всех шести цифр и неудачи совпадения с "foo", нормальным действием
будет - попытаться снова только уже с пятью цифрами \d+ item, а затем с четырьмя,
и так далее, прежде чем окончательно потерпеть неудачу. Однократные субпатэрны
предоставляют средство для специфицирования действий, как только часть патэрна
совпала: тогда он не вычисляется повторно, и поиск совпадений немедленно завершается
при первой неудаче совпадения с "foo". Нотируется это другим видом специальных
скобок, начинающихся с (?>
(?>\d+)bar
Этот вид скобок "просматривает" содержащуюся в них часть патэрна, если она совпала,
а последующая неудача в патэрне предотвращает возвращение и повторный просмотр.
Возвращение после него к предыдущим элементам, однако, работает нормально.
Альтернативное описание таково, что субпатэрн этого типа совпадает со строкой символов, с которой мог бы совпасть идентичный отдельный субпатэрн, если он заякорен в текущей точке строки-субъекта.
| |