International PHP Conference Berlin 2025

Введение

Модуль реализует подсистему асинхронного ввода-вывода интерфейса POSIX через библиотеку » 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() в callback-функции, которую передали в функцию eio_symlink():

Пример #2 Создание запроса с использованием callback-функции

<?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 Пример запроса вызова из callback-функции запроса

<?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 и добавляем запрос в группу
// Передаём переменную $filename в callback-функцию
$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", 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 */
?>

Добавить

Примечания пользователей

Пользователи ещё не добавляли примечания для страницы
To Top