Eio
PHP Manual

Введение

Данное расширение реализует подсистему ввода-вывода 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();
?>
В приведенном выше примере запрос eio_rename() может быть выполнен перед eio_symlink(). Правильным решением будет вызов eio_rename() функцией обратного вызова в eio_symlink() (т.н. callback-функции):

Пример #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$linkEIO_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();
?>
Группа - это специальный вид запроса, позволяющий создать набор обычных eio-запросов. Это может быть использовано для создания сложных запросов, открывающих, читающих и закрывающих файл.

Начиная с версии 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"0750EIO_PRI_DEFAULT"my_res_cb""mkdir data");
/* Прочие eio_* запросы  ... */


// Установка флагов события
event_set($event$fdEV_READ /*| EV_PERSIST*/"my_eio_poll", array($event$base));

// Установка основы события 
event_base_set($event$base);

// Включение события
event_add($event);

// Запуск цикла обработки
event_base_loop($base);

/* То же самое доступно через интерфейс буфера libevent */
?>


Eio
PHP Manual