<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/refs.fileprocess.process.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ru',
  ),
  'this' => 
  array (
    0 => 'book.eio.php',
    1 => 'Eio',
    2 => 'Eio',
  ),
  'up' => 
  array (
    0 => 'refs.fileprocess.process.php',
    1 => 'Модули управления процессами программ',
  ),
  'prev' => 
  array (
    0 => 'refs.fileprocess.process.php',
    1 => 'Модули управления процессами программ',
  ),
  'next' => 
  array (
    0 => 'eio.setup.php',
    1 => 'Установка и настройка',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ru',
    'path' => 'reference/eio/book.xml',
  ),
  'history' => 
  array (
  ),
  'extra_header_links' => 
  array (
    'rel' => 'alternate',
    'href' => '/manual/en/feeds/book.eio.atom',
    'type' => 'application/atom+xml',
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="book.eio" class="book">
 
 <h1 class="title">Eio</h1>
 

 <div id="intro.eio" class="preface">
  <h1 class="title">Введение</h1>
  <p class="simpara">
   Модуль реализует подсистему асинхронного ввода-вывода интерфейса POSIX
   через библиотеку <a href="http://software.schmorp.de/pkg/libeio.html" class="link external">&raquo;&nbsp;libeio</a> языка C,
   которую написал Марк Леманн (Marc Lehmann).
  </p>

  <blockquote class="note"><p><strong class="note">Замечание</strong>: <span class="simpara">Для Windows-платформ
этот модуль недоступен.</span></p></blockquote>

  <p class="para">

  <div class="warning"><strong class="warning">Внимание</strong>
  <p class="simpara">
  Важно знать, что каждый запрос выполняется в отдельном потоке,
  и порядок выполнения запросов постоянной очереди
  непредсказуем. Например, следующий фрагмент кода неверен.
  </p>
  </div>

  <div class="example" id="example-1">
  <p><strong>Пример #1 Пример неправильных запросов</strong></p>
  <div class="example-contents"><div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #FF8000">// Запрос на создание символической ссылки $link на файл $filename<br /></span><span style="color: #0000BB">eio_symlink</span><span style="color: #007700">(</span><span style="color: #0000BB">$filename</span><span style="color: #007700">, </span><span style="color: #0000BB">$link</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// Запрос на переименование файла $filename в $new_filename<br /></span><span style="color: #0000BB">eio_rename</span><span style="color: #007700">(</span><span style="color: #0000BB">$filename</span><span style="color: #007700">, </span><span style="color: #0000BB">$new_filename</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// Обработка запросов<br /></span><span style="color: #0000BB">eio_event_loop</span><span style="color: #007700">();<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   </div>

   В приведённом примере запрос функции <span class="function"><a href="function.eio-rename.php" class="function">eio_rename()</a></span> иногда завершается
   раньше функции <span class="function"><a href="function.eio-symlink.php" class="function">eio_symlink()</a></span>. Правильным решением будет вызов
   функции <span class="function"><a href="function.eio-rename.php" class="function">eio_rename()</a></span> в callback-функции, которую передали
   в функцию <span class="function"><a href="function.eio-symlink.php" class="function">eio_symlink()</a></span>:
  <div class="example" id="example-2">
   <p><strong>Пример #2 Создание запроса с использованием callback-функции</strong></p>
   <div class="example-contents"><div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">function </span><span style="color: #0000BB">my_symlink_done</span><span style="color: #007700">(</span><span style="color: #0000BB">$filename</span><span style="color: #007700">, </span><span style="color: #0000BB">$result</span><span style="color: #007700">)<br />{<br />    </span><span style="color: #FF8000">// Запрос на переменование файла $filename в файл $new_filename<br />    </span><span style="color: #0000BB">eio_rename</span><span style="color: #007700">(</span><span style="color: #0000BB">$filename</span><span style="color: #007700">, </span><span style="color: #DD0000">"/path/to/new-name"</span><span style="color: #007700">);<br /><br />    </span><span style="color: #FF8000">// Выполнение запросов<br />    </span><span style="color: #0000BB">eio_event_loop</span><span style="color: #007700">();<br />}<br /><br /></span><span style="color: #FF8000">// Запрос на создание символической ссылки $link на файл $filename<br /></span><span style="color: #0000BB">eio_symlink</span><span style="color: #007700">(</span><span style="color: #0000BB">$filename</span><span style="color: #007700">, </span><span style="color: #0000BB">$link</span><span style="color: #007700">, </span><span style="color: #0000BB">EIO_PRI_DEFAULT</span><span style="color: #007700">, </span><span style="color: #DD0000">"my_symlink_done"</span><span style="color: #007700">, </span><span style="color: #0000BB">$filename</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// Обработка запросов<br /></span><span style="color: #0000BB">eio_event_loop</span><span style="color: #007700">();<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>

  Альтернативное решение — создать группу запросов:

  <div class="example" id="example-3">
   <p><strong>Пример #3 Пример запроса вызова из callback-функции запроса</strong></p>
   <div class="example-contents"><div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #FF8000">/* Функция вызывается после выполнения группы запросов */<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">my_grp_done</span><span style="color: #007700">(</span><span style="color: #0000BB">$data</span><span style="color: #007700">, </span><span style="color: #0000BB">$result</span><span style="color: #007700">)<br />{<br />    </span><span style="color: #FF8000">// ...<br /></span><span style="color: #007700">}<br /><br />function </span><span style="color: #0000BB">my_symlink_done</span><span style="color: #007700">(</span><span style="color: #0000BB">$filename</span><span style="color: #007700">, </span><span style="color: #0000BB">$result</span><span style="color: #007700">)<br />{<br />    </span><span style="color: #FF8000">// Создаём запрос функции eio_rename и добавляем запрос в группу<br />    </span><span style="color: #0000BB">$req </span><span style="color: #007700">= </span><span style="color: #0000BB">eio_rename</span><span style="color: #007700">(</span><span style="color: #0000BB">$filename</span><span style="color: #007700">, </span><span style="color: #DD0000">"/path/to/new-name"</span><span style="color: #007700">);<br />    </span><span style="color: #0000BB">eio_grp_add</span><span style="color: #007700">(</span><span style="color: #0000BB">$grp</span><span style="color: #007700">, </span><span style="color: #0000BB">$req</span><span style="color: #007700">);<br />    </span><span style="color: #FF8000">// Возможно, потребуется добавить больше запросов…<br /></span><span style="color: #007700">}<br /><br /></span><span style="color: #FF8000">// Создаём группу запросов<br /></span><span style="color: #0000BB">$grp </span><span style="color: #007700">= </span><span style="color: #0000BB">eio_grp</span><span style="color: #007700">(</span><span style="color: #DD0000">"my_grp_done"</span><span style="color: #007700">, </span><span style="color: #DD0000">"my_grp_data"</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// Создаём запрос функции eio_symlink и добавляем запрос в группу<br />// Передаём переменную $filename в callback-функцию<br /></span><span style="color: #0000BB">$req </span><span style="color: #007700">= </span><span style="color: #0000BB">eio_symlink</span><span style="color: #007700">(<br />    </span><span style="color: #0000BB">$filename</span><span style="color: #007700">,<br />    </span><span style="color: #0000BB">$link</span><span style="color: #007700">,<br />    </span><span style="color: #0000BB">EIO_PRI_DEFAULT</span><span style="color: #007700">,<br />    </span><span style="color: #DD0000">"my_symlink_done"</span><span style="color: #007700">,<br />    </span><span style="color: #0000BB">$filename<br /></span><span style="color: #007700">);<br /></span><span style="color: #0000BB">eio_grp_add</span><span style="color: #007700">(</span><span style="color: #0000BB">$grp</span><span style="color: #007700">, </span><span style="color: #0000BB">$req</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// Обрабатываем запросы<br /></span><span style="color: #0000BB">eio_event_loop</span><span style="color: #007700">();<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div></div>

  </div>

  Группа — вид запроса, который умеет накапливать набор стандартных
  <em>eio</em>-запросов. Запросы аккумулируют, чтобы создать
  сложный запрос, который открывает, читает и закрывает файл.
  </p>
  <p class="para">
  Начиная с версии 0.3.0 alpha переменную для внутреннего
  взаимодействия с библиотекой libeio получают функцией
  <span class="function"><a href="function.eio-get-event-stream.php" class="function">eio_get_event_stream()</a></span>. Переменную привязывают
  к циклу обработки событий, который поддерживают другие модули.
  Можно было бы организовать простой цикл обработки событий, в котором модуль eio и библиотека libevent работают вместе.
  <div class="example" id="example-4">
   <p><strong>Пример #4 Пример совместной работы модуля eio и библиотеки libevent</strong></p>
   <div class="example-contents"><div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">function </span><span style="color: #0000BB">my_eio_poll</span><span style="color: #007700">(</span><span style="color: #0000BB">$fd</span><span style="color: #007700">, </span><span style="color: #0000BB">$events</span><span style="color: #007700">, </span><span style="color: #0000BB">$arg</span><span style="color: #007700">)<br />{<br />    </span><span style="color: #FF8000">/* Некоторые действия с libevent могут быть здесь */<br />    </span><span style="color: #007700">if (</span><span style="color: #0000BB">eio_nreqs</span><span style="color: #007700">()) {<br />        </span><span style="color: #0000BB">eio_poll</span><span style="color: #007700">();<br />    }<br />    </span><span style="color: #FF8000">/* .. и здесь */<br /></span><span style="color: #007700">}<br /><br />function </span><span style="color: #0000BB">my_res_cb</span><span style="color: #007700">(</span><span style="color: #0000BB">$d</span><span style="color: #007700">, </span><span style="color: #0000BB">$r</span><span style="color: #007700">)<br />{<br />    </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$r</span><span style="color: #007700">);<br />    </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$d</span><span style="color: #007700">);<br />}<br /><br /></span><span style="color: #0000BB">$base </span><span style="color: #007700">= </span><span style="color: #0000BB">event_base_new</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$event </span><span style="color: #007700">= </span><span style="color: #0000BB">event_new</span><span style="color: #007700">();<br /><br /></span><span style="color: #FF8000">// Этот поток требуется для привязки к libevent<br /></span><span style="color: #0000BB">$fd </span><span style="color: #007700">= </span><span style="color: #0000BB">eio_get_event_stream</span><span style="color: #007700">();<br /><br /></span><span style="color: #0000BB">eio_nop</span><span style="color: #007700">(</span><span style="color: #0000BB">EIO_PRI_DEFAULT</span><span style="color: #007700">, </span><span style="color: #DD0000">"my_res_cb"</span><span style="color: #007700">, </span><span style="color: #DD0000">"nop data"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">eio_mkdir</span><span style="color: #007700">(</span><span style="color: #DD0000">"/tmp/abc-eio-temp"</span><span style="color: #007700">, </span><span style="color: #0000BB">0750</span><span style="color: #007700">, </span><span style="color: #0000BB">EIO_PRI_DEFAULT</span><span style="color: #007700">, </span><span style="color: #DD0000">"my_res_cb"</span><span style="color: #007700">, </span><span style="color: #DD0000">"mkdir data"</span><span style="color: #007700">);<br /></span><span style="color: #FF8000">/* Прочие eio_* запросы  ... */<br /><br /><br />// Установка флагов события<br /></span><span style="color: #0000BB">event_set</span><span style="color: #007700">(</span><span style="color: #0000BB">$event</span><span style="color: #007700">, </span><span style="color: #0000BB">$fd</span><span style="color: #007700">, </span><span style="color: #0000BB">EV_READ </span><span style="color: #FF8000">/*| EV_PERSIST*/</span><span style="color: #007700">, </span><span style="color: #DD0000">"my_eio_poll"</span><span style="color: #007700">, array(</span><span style="color: #0000BB">$event</span><span style="color: #007700">, </span><span style="color: #0000BB">$base</span><span style="color: #007700">));<br /><br /></span><span style="color: #FF8000">// Установка основы события<br /></span><span style="color: #0000BB">event_base_set</span><span style="color: #007700">(</span><span style="color: #0000BB">$event</span><span style="color: #007700">, </span><span style="color: #0000BB">$base</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// Включение события<br /></span><span style="color: #0000BB">event_add</span><span style="color: #007700">(</span><span style="color: #0000BB">$event</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// Запуск цикла обработки<br /></span><span style="color: #0000BB">event_base_loop</span><span style="color: #007700">(</span><span style="color: #0000BB">$base</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">/* То же самое доступно через интерфейс буфера libevent */<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div></div>

  </div>

  </p>
 </div>

 





 





 





 







<ul class="chunklist chunklist_book"><li><a href="eio.setup.php">Установка и настройка</a><ul class="chunklist chunklist_book chunklist_children"><li><a href="eio.requirements.php">Требования</a></li><li><a href="eio.installation.php">Установка</a></li><li><a href="eio.configuration.php">Настройка во время выполнения</a></li><li><a href="eio.resources.php">Типы ресурсов</a></li></ul></li><li><a href="eio.constants.php">Предопределённые константы</a></li><li><a href="eio.examples.php">Примеры</a></li><li><a href="ref.eio.php">Функции модуля Eio</a><ul class="chunklist chunklist_book chunklist_children"><li><a href="function.eio-busy.php">eio_busy</a> — Искусственно увеличивает нагрузку. Может быть полезно при тестировании,
  изучении производительности</li><li><a href="function.eio-cancel.php">eio_cancel</a> — Отменяет запрос</li><li><a href="function.eio-chmod.php">eio_chmod</a> — Изменяет права доступа к файлу/директории</li><li><a href="function.eio-chown.php">eio_chown</a> — Изменяет права доступа к файлу/директории</li><li><a href="function.eio-close.php">eio_close</a> — Закрыть файл</li><li><a href="function.eio-custom.php">eio_custom</a> — Выполняет пользовательский запрос как любой другой eio_* вызов</li><li><a href="function.eio-dup2.php">eio_dup2</a> — Создаёт дубликат дескриптора файла</li><li><a href="function.eio-event-loop.php">eio_event_loop</a> — Взаимодействует с libeio до тех пор, пока все запросы не будут выполнены</li><li><a href="function.eio-fallocate.php">eio_fallocate</a> — Позволяет напрямую управлять размером используемого дискового пространства для файла</li><li><a href="function.eio-fchmod.php">eio_fchmod</a> — Изменяет права доступа к файлу</li><li><a href="function.eio-fchown.php">eio_fchown</a> — Изменяет владельца файла</li><li><a href="function.eio-fdatasync.php">eio_fdatasync</a> — Синхронизирует текущее состояние файла с физическим устройством</li><li><a href="function.eio-fstat.php">eio_fstat</a> — Возвращает статус файла</li><li><a href="function.eio-fstatvfs.php">eio_fstatvfs</a> — Возвращает статистику файловой системы</li><li><a href="function.eio-fsync.php">eio_fsync</a> — Синхронизирует текущее состояние файла с физическим устройством</li><li><a href="function.eio-ftruncate.php">eio_ftruncate</a> — Урезает размер файла</li><li><a href="function.eio-futime.php">eio_futime</a> — Изменяет дату и время последней модификации и доступа к файлу</li><li><a href="function.eio-get-event-stream.php">eio_get_event_stream</a> — Возвращает поток, отражающий переменную, используемую при взаимодействии с libeio</li><li><a href="function.eio-get-last-error.php">eio_get_last_error</a> — Возвращает строку с описанием последней ошибки, которая связана с ресурсом запроса</li><li><a href="function.eio-grp.php">eio_grp</a> — Создаёт группу запросов</li><li><a href="function.eio-grp-add.php">eio_grp_add</a> — Добавляет запрос в группу запросов</li><li><a href="function.eio-grp-cancel.php">eio_grp_cancel</a> — Отменяет группу запросов</li><li><a href="function.eio-grp-limit.php">eio_grp_limit</a> — Устанавливает предельное количество запросов в группе</li><li><a href="function.eio-init.php">eio_init</a> — (Ре-)инициализирует Eio</li><li><a href="function.eio-link.php">eio_link</a> — Создаёт жёсткую ссылку на файл</li><li><a href="function.eio-lstat.php">eio_lstat</a> — Возвращает статус файла</li><li><a href="function.eio-mkdir.php">eio_mkdir</a> — Создание директории</li><li><a href="function.eio-mknod.php">eio_mknod</a> — Создаёт специальный или обычный файл</li><li><a href="function.eio-nop.php">eio_nop</a> — Проход по циклу запроса, не совершая никаких операций</li><li><a href="function.eio-npending.php">eio_npending</a> — Возвращает число завершённых, но необработанных процессов</li><li><a href="function.eio-nready.php">eio_nready</a> — Возвращает число ещё не обработанных запросов</li><li><a href="function.eio-nreqs.php">eio_nreqs</a> — Возвращает число запросов, которые предстоит выполнить</li><li><a href="function.eio-nthreads.php">eio_nthreads</a> — Возвращает количество используемых в данный момент потоков</li><li><a href="function.eio-open.php">eio_open</a> — Открывает файл</li><li><a href="function.eio-poll.php">eio_poll</a> — Может быть вызвана когда имеются запросы, ожидающие выполнения</li><li><a href="function.eio-read.php">eio_read</a> — Читает данные из файла, начиная с заданного смещения</li><li><a href="function.eio-readahead.php">eio_readahead</a> — Помещает данные из файла в кеш страницы</li><li><a href="function.eio-readdir.php">eio_readdir</a> — Читает содержимое директории</li><li><a href="function.eio-readlink.php">eio_readlink</a> — Читает значение символической ссылки</li><li><a href="function.eio-realpath.php">eio_realpath</a> — Получает абсолютный приведённый к каноническому виду путь</li><li><a href="function.eio-rename.php">eio_rename</a> — Изменяет имя или перемещает файл</li><li><a href="function.eio-rmdir.php">eio_rmdir</a> — Удаляет директорию</li><li><a href="function.eio-seek.php">eio_seek</a> — Перемещает положение файлового указателя</li><li><a href="function.eio-sendfile.php">eio_sendfile</a> — Перемещает данные между файлами</li><li><a href="function.eio-set-max-idle.php">eio_set_max_idle</a> — Устанавливает максимальное количество ожидающих потоков</li><li><a href="function.eio-set-max-parallel.php">eio_set_max_parallel</a> — Устанавливает максимальное количество параллельных потоков</li><li><a href="function.eio-set-max-poll-reqs.php">eio_set_max_poll_reqs</a> — Устанавливает максимальное количество обрабатываемых запросов</li><li><a href="function.eio-set-max-poll-time.php">eio_set_max_poll_time</a> — Устанавливает максимальное время выполнения</li><li><a href="function.eio-set-min-parallel.php">eio_set_min_parallel</a> — Устанавливает минимальное количество параллельных потоков</li><li><a href="function.eio-stat.php">eio_stat</a> — Возвращает статус файла</li><li><a href="function.eio-statvfs.php">eio_statvfs</a> — Возвращает статистику файловой системы</li><li><a href="function.eio-symlink.php">eio_symlink</a> — Создаёт символическую ссылку</li><li><a href="function.eio-sync.php">eio_sync</a> — Записывает кеш из буфера на диск</li><li><a href="function.eio-sync-file-range.php">eio_sync_file_range</a> — Синхронизирует сегмент файла с данными файла на внешнем хранилище</li><li><a href="function.eio-syncfs.php">eio_syncfs</a> — Вызывает системный syncfs в Linux, если это доступно</li><li><a href="function.eio-truncate.php">eio_truncate</a> — Урезает размер файла</li><li><a href="function.eio-unlink.php">eio_unlink</a> — Удаляет файл или одну из жёстких ссылок на него</li><li><a href="function.eio-utime.php">eio_utime</a> — Изменяет дату и время последней модификации и доступа к файлу</li><li><a href="function.eio-write.php">eio_write</a> — Запись в файл</li></ul></li></ul></div><?php manual_footer($setup); ?>