Данное расширение реализует подсистему ввода-вывода POSIX I/O by средств » libeio Библиотека C Написана Марком Леманном (Marc Lehmann).
Замечание: Для Windows-платформ это расширение недоступно.
Следует учесть, что каждый запрос выполняется в отдельном потоке, при этом исполнение запросов непрерывно, а их порядок в очереди исполнения непредсказуем. Например, нижеприведенный пример кода неверен.
Пример #1 Пример неправильных запросов
<?php
// Запрос на создание символической ссылки $link на файл $filename
eio_symlink($filename, $link);
// Запрос на переименование файла $filename в $new_filename
eio_rename($filename, $new_filename);
// Выполнение запросов
eio_event_loop();
?>
Пример #2 Создание запроса с использование функции обратного вызова
<?php
function my_symlink_done($filename, $result) {
// Запрос на переменование $filename в $new_filename
eio_rename($filename, "/path/to/new-name");
// Выполнение запросов
eio_event_loop();
}
// Запрос на создание символической ссылки $link на файл $filename
eio_symlink($filename, $link, EIO_PRI_DEFAULT, "my_symlink_done", $filename);
// Выполнение запросов
eio_event_loop();
?>
Пример #3 Создание запроса с использование функции обратного вызова
<?php
/* Функция вызывается после выполнения группы запросов */
function my_grp_done($data, $result) {
// ...
}
function my_symlink_done($filename, $result) {
// Создание запроса eio_rename и добавление его в группу
$req = eio_rename($filename, "/path/to/new-name");
eio_grp_add($grp, $req);
// Возможно, вы захотите добавить больше запросов...
}
// Создание группы запросов
$grp = eio_grp("my_grp_done", "my_grp_data");
// Создание запроса eio_symlink request и добавление в группу
// Передача $filename в функцию обратного вызова
$req = eio_symlink($filename, $link,
EIO_PRI_DEFAULT, "my_symlink_done", $filename);
eio_grp_add($grp, $req);
// Выполнение запросов
eio_event_loop();
?>
Начиная с версии 0.3.0 alpha, переменная, используемая для внутреннего взаимодействия с libeio, может быть получена функцией eio_get_event_stream(). Переменная может быть использована для привязке к циклу обработки, поставляемого сторонним расширением. Возможно организовать простой цикл обработки, где eio и libevent работают совместно.
Пример #4 Использование eio совместно с libevent
<?php
function my_eio_poll($fd, $events, $arg) {
/* Некоторые действия с libevent могут быть здесь */
if (eio_nreqs()) {
eio_poll();
}
/* .. и здесь */
}
function my_res_cb($d, $r) {
var_dump($r); var_dump($d);
}
$base = event_base_new();
$event = event_new();
// Этот поток требуется для привязки к libevent
$fd = eio_get_event_stream();
eio_nop(EIO_PRI_DEFAULT, "my_res_cb", "nop data");
eio_mkdir("/tmp/abc-eio-temp", 0750, EIO_PRI_DEFAULT, "my_res_cb", "mkdir data");
/* Прочие eio_* запросы ... */
// Установка флагов события
event_set($event, $fd, EV_READ /*| EV_PERSIST*/, "my_eio_poll", array($event, $base));
// Установка основы события
event_base_set($event, $base);
// Включение события
event_add($event);
// Запуск цикла обработки
event_base_loop($base);
/* То же самое доступно через интерфейс буфера libevent */
?>