mirror of
https://github.com/php/doc-ru.git
synced 2026-03-23 23:32:16 +01:00
206 lines
6.8 KiB
XML
206 lines
6.8 KiB
XML
<?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>
|
||
|
||
¬e.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
|
||
-->
|