stream_select

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

stream_select — Запускає еквівалент системного виклику select() на заданих масивах потоків з часом очікування, вказаним параметрами seconds та microseconds

Опис

stream_select(    ?array &$read,    ?array &$write,    ?array &$except,    ?int $seconds,    ?int $microseconds = null): int|false

Функцияstream_select() отримує масиви потоків і чекає зміни їхнього статусу. Її робота еквівалентна роботі функції socket_select(), За винятком того, що вона працює з потоками.

Список параметрів

read

Потоки, перелічені у масиві read будуть відстежуватися на предмет появи символів, доступних для читання (точніше, щоб переконатися, що читання не блокуватиметься - зокрема потоковий ресурс також готовий для читання в кінці файлу, але в цьому випадку функція fread() повертатиме рядок нульової довжини).

write

Потоки, перелічені у масиві write, будуть відстежуватися щодо того, що запис у них не буде блокуватися.

except

Потоки, перелічені у масиві except, будуть відстежуватися щодо надходження високопріоритетних виняткових (позасмугових або "out-of-band") даних.

Зауваження :

Когдаstream_select() повертається, масиви read writeиexcept змінюються для того, щоб вказати, які потокові ресурси насправді змінили статус. Вихідні ключі масивів зберігаються.

seconds

Параметри secondsиmicrosecondsвместе формируют параметрtimeout seconds вказує кількість секунд, а microseconds- число микросекунд. Параметрtimeout - це верхня межа часу, яка функція stream_select() чекатиме до повернення. Якщо параметри secondsиmicroseconds обидва встановлені в , то функцияstream_select() не чекатиме даних - натомість вона повернеться негайно, вказуючи поточний статус потоків.

Якщо параметр secondsравен**null, то функцияstream_select()** може виконуватися невизначений час, повертаючись тільки тоді, коли відбувається подія на одному з потоків, що відстежуються (або якщо системний виклик переривається сигналом).

Увага

Использование значения времени ожидания позволяет вам мгновенно опросить статус потоков, однако ПЛОХАЯ идея использовать значение времени ожидания у циклі, оскільки це змусить ваш скрипт споживати занадто багато процесорного часу.

Набагато краще вказати значення часу очікування в кілька секунд, хоча якщо вам потрібно перевіряти та одночасно запускати інший код, використання часу очікування як мінімум 200000 мікросекунд допоможе зменшити використання процесорного часу вашим скриптом.

Запам'ятайте, що значення часу очікування – це максимальний час, який буде витрачено. Функція stream_select() повернеться як тільки запитані потоки будуть готові до використання.

microseconds

Смотрите описание параметраseconds

Значення, що повертаються

У разі успішного виконання функція stream_select() повертає кількість потокових ресурсів, що міститься в змінених масивах, яка може дорівнювати нулю, якщо перевищено час очікування до того, як сталося щось цікаве. У разі виникнення помилки повертається false і виникає попередження (це може статися, якщо системний виклик переривається вхідним сигналом).

список змін

ВерсияОпис
8.1.0Параметрmicroseconds тепер припускає значення null

Приклади

Приклад #1 Приклад використання stream_select()****

Цей приклад перевіряє, що отримано дані для читання на потоках $stream1или$stream2Так как значение времени ожидания равно , функція повернеться негайно:

Loading...

Примітки

Зауваження :

Через обмеження в поточному Zend Engine неможливо передати постійну null безпосередньо як параметр у функцію, яка очікує, що цей параметр буде передано за посиланням. Натомість використовуйте тимчасову змінну або вираз, у якому крайній лівий член буде тимчасовою змінною:

Loading...

Зауваження :

Переконайтеся, що використовуєте оператор ===при проверке на ошибку. Так как функцияstream_select() може повертати 0, порівняння з використанням == може повертати true :

Loading...

Зауваження :

Якщо ви читаєте/пишете в потік, що повертається в масивах, знайте, що вони не обов'язково читають/пишуть повну кількість даних, які ви запросили. Будьте готові до того, щоб мати можливість читати/писати навіть по одному байту.

Зауваження :

Деякі потоки (наприклад, zlib) не можуть бути обрані цією функцією.

Зауваження Сумісність із Windows

Использование функцииstream_select() на файлових дескрипторах, повернутих функцією proc_open() не вдасться і поверне **false**под Windows.

STDIN з консолі змінює статус, як тільки стають доступними будь-які вхідні події, але читання потоку все ще може блокуватися.

Дивіться також

  • stream_set_blocking() - Встановити блокуючий/неблокуючий режим у потоці