Клас Ev
(PECL ev >= 0.2.0)
Вступ
Клас EV є статичним класом, забезпечуючи доступ до циклу за замовчуванням та деяким поширеним операціям.
Огляд класів
final
class Ev
{
/* Константы */
const
int
FLAG_AUTO = 0;
const
int
FLAG_NOENV = 16777216;
const
int
FLAG_FORKCHECK = 33554432;
const
int
FLAG_NOINOTIFY = 1048576;
const
int
FLAG_SIGNALFD = 2097152;
const
int
FLAG_NOSIGMASK = 4194304;
const
int
RUN_NOWAIT = 1;
const
int
RUN_ONCE = 2;
const
int
BREAK_CANCEL = 0;
const
int
BREAK_ONE = 1;
const
int
BREAK_ALL = 2;
const
int
MINPRI = -2;
const
int
MAXPRI = 2;
const
int
READ = 1;
const
int
WRITE = 2;
const
int
TIMER = 256;
const
int
PERIODIC = 512;
const
int
SIGNAL = 1024;
const
int
CHILD = 2048;
const
int
STAT = 4096;
const
int
IDLE = 8192;
const
int
PREPARE = 16384;
const
int
CHECK = 32768;
const
int
EMBED = 65536;
const
int
CUSTOM = 16777216;
const
int
ERROR = 2147483648;
const
int
BACKEND_SELECT = 1;
const
int
BACKEND_POLL = 2;
const
int
BACKEND_EPOLL = 4;
const
int
BACKEND_KQUEUE = 8;
const
int
BACKEND_DEVPOLL = 16;
const
int
BACKEND_PORT = 32;
const
int
BACKEND_ALL = 63;
const
int
BACKEND_MASK = 65535;
/* Методы */
final
public
static
backend(): int
final
public
static
depth(): int
final
public
static
embeddableBackends(): int
final
public
static
feedSignal(
int
$signum
): void
final
public
static
feedSignalEvent(
int
$signum
): void
final
public
static
iteration(): int
final
public
static
now(): float
final
public
static
nowUpdate(): void
final
public
static
recommendedBackends(): int
final
public
static
resume(): void
final
public
static
run(
int
$flags
= ?): void
final
public
static
sleep(
float
$seconds
): void
final
public
static
stop(
int
$how
= ?): void
final
public
static
supportedBackends(): int
final
public
static
suspend(): void
final
public
static
time(): float
final
public
static
verify(): void
}
Обумовлені константи
Прапори, що передаються під час створення циклу:
Ev::FLAG_AUTO
Задає прапори значення за замовчуванням
Ev::FLAG_NOENV
Якщо прапор використовується (або програма запускає setuid або setgid), то libev
не смотрит на переменную окружения LIBEV_FLAGS. В іншому випадку (за умовчанням), якщо знайдено LIBEV_FLAGS, то він повністю перевизначає прапори. Корисно для тестів продуктивності та пошуку помилок.
Ev::FLAG_FORKCHECK
Примушує libev перевіряти розгалуження в кожній ітерації замість виклику EvLoop::fork() вручну. Це працює шляхом виклику getpid()
на кожній ітерації циклу, і, таким чином, це може уповільнити роботу циклу подій з великою кількістю циклів ітерацій, але зазвичай не сильно. Цей прапор не може бути перевизначений або вказаний у змінному середовищі LIBEV_FLAGS.
Ev::FLAG_NOINOTIFY
Якщо цей прапор вказано, то libev
не намагатиметься використовувати API inotify
для своїх спостерігачів » ev_stat Прапор може бути корисним для збереження файлових дескрипторів inotify, інакше кожен цикл, що використовує спостерігачів ev_stat
, споживатиме один дескриптор inotify
Ev::FLAG_SIGNALFD
Якщо прапор вказано, то libev
намагатиметься використовувати API signalfd
для своїх спостерігачів » ev_signal(и» ev_child). API передає сигнали синхронно, що робить його швидшим і, можливо, дозволить отримати дані з черги сигналів, а також дозволяє спростити обробку сигналів за допомогою потоків, оскільки сигнали коректно блокуються в потоках . Signalfd
не используется по умолчанию.
Ev::FLAG_NOSIGMASK
Якщо вказано прапор, то libev
уникатиме зміни маски сигналу. Зокрема, це застосовується, щоб перед отриманням сигналу переконатися, що його розблоковано.
Така поведінка корисна для обробки сигналів користувача або обробки сигналів тільки певних потоків.
Прапори, що передаються в Ev::run(), илиEvLoop::run()
Ev::RUN_NOWAIT
Означає, що цикл подій шукатиме і оброблятиме нові події, а також будь-які очікувані виконання події з них, але не чекатиме і блокуватиме процес у разі, якщо не було жодних подій і завершиться після однієї ітерації циклу. Це іноді корисно для опитування та опрацювання нових подій під час виконання тривалих обчислень, зберігаючи при цьому можливість взаємодії з програмою.
Ev::RUN_ONCE
Означає, що цикл подій шукатиме нові події (очікуючи, у разі потреби) та обробляти ці та будь-які вже очікуючі події з них. Він блокуватиме процес, доки не надійде принаймні одна нова подія (це може бути внутрішня подія libev, тому немає жодної гарантії, що буде викликана задана callback-функція) і завершиться після однієї ітерації циклу.
Прапори, що передаються в Ev::stop(), илиEvLoop::stop()
Ev::BREAK_CANCEL
Скасування операції переривання.
Ev::BREAK_ONE
Повертає найглибший запит Ev::run()(илиEvLoop::run()
Ev::BREAK_ALL
Завершує всі вкладені дзвінки Ev::run()(илиEvLoop::run()
Пріоритети спостерігачів:
Ev::MINPRI
Мінімально допустимий пріоритет спостерігача.
Ev::MAXPRI
Найбільш допустимий пріоритет спостерігача.
Побутові маски (отриманих) подій:
Ev::READ
Дескриптор файлу у спостерігачі EvIoдоступен для чтения.
Ev::WRITE
Дескриптор файлу у спостерігачі EvIoдоступен для записи.
Ev::TIMER
EvTimer спостерігає за перевищенням ліміту часу.
Ev::PERIODIC
EvPeriodic спостерігає за перевищенням ліміту часу.
Ev::SIGNAL
Вказаний у EvSignal::__construct()сигнал получен.
Ev::CHILD
pid
Вказаний у EvChild::__construct() отримано і статус змінено.
Ev::STAT
Шлях, вказаний у спостерігачі EvStat змінив свої атрибути.
Ev::IDLE
Спостерігач EvIdle працює, коли решта спостерігачів нічого не робить.
Ev::PREPARE
Усі спостерігачі EvPrepare викликані рівно перед стартом Ev::run()таким образом, наблюдателиEvPrepare є останніми викликаними спостерігачами перед тим, як цикл подій засне чи опитає нові події.
Ev::CHECK
Усі спостерігачі EvCheck поміщені в чергу відразу після того, як Ev::run() зібрав нові події, але до того, як вони викличуть якусь callback-функцію для отриманих подій. Таким чином, спостерігачі EvCheck будуть викликані раніше, ніж будь-які інші спостерігачі з таким самим або нижчим пріоритетом у цій ітерації циклу подій.
Ev::EMBED
Вбудований цикл подій, заданий у спостерігачі EvEmbedтребует к себе внимания.
Ev::CUSTOM
Ніколи не надсилається (або іншим чином використовується) бібліотекою libev
самостійно, але може вільно використовуватись користувачами libev
для сигналізуючих спостерігачів (тобто за допомогою EvWatcher::feed()
Ev::ERROR
Відбулася невідома помилка і спостерігача буде зупинено. Може статися через некоректний запуск спостерігача, тому що libev
вичерпав ліміт по пам'яті, через закритий дескриптор файлу або з якоїсь ще причини . Libev
вважає, що ці помилки програми. Також читайте розділ » АНАТОМІЯ СПОСТЕРІГАЧІВ
Прапори бекенда:
Ev::BACKEND_SELECT
вибір бекенда - select(2)
Ev::BACKEND_POLL
опитування бекенда - poll(2)
Ev::BACKEND_EPOLL
Специфічний для Linux бекенд epoll(7)
для ядер до та після 2.6.9
Ev::BACKEND_KQUEUE
kqueue
- бекенде, що використовується в більшості систем BSD. Спостерігач EvEmbed може бути використаний для вставки одного циклу (з бекендом kqueue) в інший. Наприклад, можна спробувати створити цикл подій з бекендом kqueue
та використовувати його тільки для сокетів.
Ev::BACKEND_DEVPOLL
Бекенд Solaris 8. Поки що не реалізований.
Ev::BACKEND_PORT
Механізм порту подій із гарним масштабуванням у Solaris 10.
Ev::BACKEND_ALL
Пробувати всі бекенди (крім зіпсованих). Не рекомендується використовувати безпосередньо. Тут потрібно використовувати побітові операції (тобто . Ev::BACKEND_ALL
& ~ Ev::BACKEND_KQUEUE
). Використати Ev::recommendedBackends() , або не ставити жодного бекенда взагалі.
Ev::BACKEND_MASK
Чи не бекенд, але маска для вибору всіх біт бекендів зі значення flags
для виключення будь-яких бекендів. (тобто коли модифікуєте змінну оточення LIBEV_FLAGS).
Зауваження :
Для циклу за замовчуванням, під час фази ініціалізації модуля
Ev
, реєструється виклик » ev_loop_fork за допомогоюpthread_atfork
(якщо такий є).
Зауваження :
Є методи, що дозволяють отримати доступ до циклу подій за умовчаннямв классеEv(наПриклад,Ev::iteration() Ev::depth()и т.д.). Длякористувальницьких циклів (створених за допомогою EvLoop::__construct()) ці значення можуть бути доступні через відповідні властивості та методи класу EvLoop
Примірник циклу подій за умовчанням може бути вилучений за допомогою методу EvLoop::defaultLoop()
Зміст
- Ev::backend— Повертає ціле число, що описує бекенд, який використовується libev
- Ev::depth— Здобути глибину рекурсії
- Ev::embeddableBackends— Повертає набір бекендів, які можна вбудувати в інші цикли подій
- Ev::feedSignal - Передаємо подію сигналу в Ev
- Ev::feedSignalEvent— Надіслати подію сигналу в цикл за замовчуванням
- Ev::iteration— Отримати кількість опитувань циклу за умовчанням щодо нових подій
- Ev::now— Отримати час запуску останньої ітерації циклу за умовчанням
- Ev::nowUpdate— Встановлює поточний час шляхом запиту до ядра в процесі оновлюючи час, який повертається Ev::now
- Ev::recommendedBackends— Отримати бітову маску рекомендованих бекендів для даної платформи
- Ev::resume— Відновити виконання призупиненого раніше циклу подій за умовчанням
- Ev::run— Почати перевірку наявності подій та виклик callback-функцій циклу за умовчанням
- Ev::sleep— Блокувати процес задану кількість секунд
- Ev::stop— Зупинити цикл події за замовчуванням
- Ev::supportedBackends— Повертає набір бекендів, які підтримуються поточною конфігурацією libev
- Ev::suspend— Призупинити цикл подій за умовчанням
- Ev::time— Повертає поточний час у секундах, що минув з початку епохи Unix
- Ev::verify - Здійснює внутрішню перевірку цілісності (для налагодження)