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() - Встановити блокуючий/неблокуючий режим у потоці