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() - Повертає рядок, що описує помилку сокету