1
0
mirror of https://github.com/php/doc-ru.git synced 2026-03-23 23:32:16 +01:00
Files
archived-doc-ru/reference/eio/book.xml
2026-01-25 15:48:41 +00:00

206 lines
6.8 KiB
XML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 4e53894013ec0d223e2723ece46447ba00d5baf5 Maintainer: aur Status: ready -->
<!-- Reviewed: no -->
<book xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="book.eio">
<?phpdoc extension-membership="pecl" ?>
<title>Eio</title>
<titleabbrev>Eio</titleabbrev>
<!--{{{ preface -->
<preface xml:id="intro.eio">
&reftitle.intro;
<simpara>
Модуль реализует подсистему асинхронного ввода-вывода интерфейса POSIX
через библиотеку <link xlink:href="&url.eio.libeio;">libeio</link> языка C,
которую написал Марк Леманн (Marc Lehmann).
</simpara>
&note.no-windows.extension;
<para>
<warning>
<simpara>
Важно знать, что каждый запрос выполняется в отдельном потоке,
и порядок выполнения запросов постоянной очереди
непредсказуем. Например, следующий фрагмент кода неверен.
</simpara>
</warning>
<example>
<title>Пример неправильных запросов</title>
<programlisting role="php"><![CDATA[
<?php
// Запрос на создание символической ссылки $link на файл $filename
eio_symlink($filename, $link);
// Запрос на переименование файла $filename в $new_filename
eio_rename($filename, $new_filename);
// Обработка запросов
eio_event_loop();
?>
]]>
</programlisting>
</example>
В приведённом примере запрос функции <function>eio_rename</function> иногда завершается
раньше функции <function>eio_symlink</function>. Правильным решением будет вызов
функции <function>eio_rename</function> в callback-функции, которую передали
в функцию <function>eio_symlink</function>:
<example>
<title>Создание запроса с использованием callback-функции</title>
<programlisting role="php"><![CDATA[
<?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();
?>
]]>
</programlisting>
</example>
Альтернативное решение — создать группу запросов:
<example>
<title>Пример запроса вызова из callback-функции запроса</title>
<programlisting role="php"><![CDATA[
<?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();
?>
]]></programlisting>
</example>
Группа — вид запроса, который умеет накапливать набор стандартных
<emphasis>eio</emphasis>-запросов. Запросы аккумулируют, чтобы создать
сложный запрос, который открывает, читает и закрывает файл.
</para>
<para>
Начиная с версии 0.3.0 alpha переменную для внутреннего
взаимодействия с библиотекой libeio получают функцией
<function>eio_get_event_stream</function>. Переменную привязывают
к циклу обработки событий, который поддерживают другие модули.
Можно было бы организовать простой цикл обработки событий, в котором модуль eio и библиотека libevent работают вместе.
<example>
<title>Пример совместной работы модуля eio и библиотеки libevent</title>
<programlisting role="php"><![CDATA[
<?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 */
?>
]]></programlisting>
</example>
</para>
</preface>
<!--}}}-->
&reference.eio.setup;
&reference.eio.constants;
&reference.eio.examples;
&reference.eio.reference;
</book>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml fdm=marker
vi: ts=1 sw=1
-->