(PECL ev >= 0.2.0)
Наблюдатели EvIo проверяют, является ли файл, сокет или поток, преобразуемый в числовой дескриптор файла, доступным на чтение или на запись при каждой итерации событийного цикла, или, если более точно, когда чтение не заблокирует процесс, а запись сможет быть произведена. Такое поведение называется переключение уровня (level-triggering), потому, что события будут создаваться все время, пока сохраняется отслеживаемое состояние. Для прекращения создания событий надо просто остановить наблюдателя.
Количество таких наблюдателей для одного файлового дескриптора
fd
не ограничено. Желательно, но не обязательно,
установить для файлового дескриптора неблокирующий режим.
Другой момент, который необходимо держать в уме, это то, что
всегда существует возможность ложного срабатывания. Например
Ev::READ
вызовет callback-функцию, но в
то же время файл заблокируется подзапросом read().
В такую ситуацию очень легко попасть и именно поэтому рекомендуется
всегда использовать неблокирующий ввод/вывод. Возврат
read() дополнительного EAGAIN
гораздо предпочтительнее, чем "зависание" программы в ожидании данных.
Если по каким то причинам невозможно использовать
fd
в неблокирующем режиме, то имеет смысл
дополнительно проверять, доступен ли файл на чтение в данный конкретный момент.
Кто-то дополнительно использует SIGALRM
и внутренний
таймер для проверки, что блокировка не вечная.
Старайтесь всегда использовать неблокирующий режим.
$fd
,$events
,$callback
,$data
= ?,$priority
= ?$fd
,$events
,$callback
,$data
= null
,$priority
= 0