socket_select
(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)
socket_select — Запускає системний виклик select() для заданих масивів сокетів із зазначеним часом очікування
Опис
socket_select( ?array &$read, ?array &$write, ?array &$except, ?int $seconds, int $microseconds = 0): int|false
socket_select() приймає масиви сокетів та чекає їх зміни статусу. Ті, хто знайомий із сокетами BSD, виявлять, що масиви сокетів насправді є так званими наборами дескрипторів файлів. Спостерігаються три незалежні масиви ресурсів сокетів.
Список параметрів
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
, безпосередньо як параметр у функцію, яка очікує, що цей параметр буде передано за посиланням. Натомість використовуйте тимчасову змінну або вираз, де ліва сторона є тимчасовою змінною:Приклад #1 Использование
null
вsocket_select()**** Loading...
Значення, що повертаються
У разі успішного виконання socket_select() повертає кількість сокетів, що містяться в змінених масивах, яка може дорівнювати нулю, якщо час очікування закінчиться до того, як станеться щось цікаве. У разі виникнення помилки повертається false
. Код помилки може бути отриманий за допомогою socket_last_error()
Зауваження :
Обов'язково використовуйте оператор
===
під час перевірки на помилку. Оскільки socket_select() може повертати 0, порівняння з==
буде оцінюватися якtrue
:Приклад #2 Анализ результатаsocket_select()****
Loading...
Приклади
Приклад #3 Приклад використання socket_select()****
Loading...
Примітки
Зауваження :
Майте на увазі, деякі реалізації сокетів необхідно обробляти дуже обережно. Декілька основних правил:
- Ви завжди повинні спробувати використати**socket_select()**без часу очікування. Ваша програма нічого не повинна робити, якщо немає доступних даних. Код, що залежить від часу очікування, зазвичай не дуже переносимий і важкий для налагодження.
- Сокет не повинен додаватися до будь-якого масиву, якщо ви не збираєтеся перевіряти результат після викликуsocket_select(). Після повернення**socket_select()**всі сокети у всіх масивах мають бути перевірені. Будь-який сокет, доступний для запису чи читання, повинен використовуватися для запису чи читання.
- Якщо ви читаєте або записуєте з сокету, що повертається в масивах, майте на увазі, що він необов'язково зможе прочитати або записати дані, які ви запитуєте. Будьте готові прочитати або записати лише один байт.
- Зазвичай для більшості реалізацій сокетів єдиний виняток, упійманий за допомогою масиву
except
- Це дані без прив'язки, отримані в сокеті.
Дивіться також
- socket_read() - Читає рядок максимальну довжину байт із сокету
- socket_write() - Запис у сокет
- socket_last_error() - Повертає останню помилку на сокеті
- socket_strerror() - Повертає рядок, що описує помилку сокету