<?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 => 'ja',
  ),
  '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' => 'ja',
    '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 I/O 機能を提供します。
   Marc Lehmann による <a href="http://software.schmorp.de/pkg/libeio.html" class="link external">&raquo;&nbsp;libeio</a> C
   ライブラリを利用します。
  </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 /></span><span style="color: #FF8000">// $filename のシンボリックリンクを $link に作るリクエスト<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 /></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> を
   <span class="function"><a href="function.eio-symlink.php" class="function">eio_symlink()</a></span> のコールバックの中から呼びます。
  <div class="example" id="example-2">
   <p><strong>例2 リクエストコールバックからのリクエストの呼び出し</strong></p>
   <div class="example-contents"><div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<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 /> </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">// $filename のシンボリックリンクを $link に作るリクエスト<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 /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>

  あるいは、リクエストグループを作るという手もあります。

  <div class="example" id="example-3">
   <p><strong>例3 リクエストコールバックからのリクエストの呼び出し</strong></p>
   <div class="example-contents"><div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<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 /> </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 /> </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 をコールバックに渡します<br /></span><span style="color: #0000BB">$req </span><span style="color: #007700">= </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 />  </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 /></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 /></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 /></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 />    </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 />    </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$r</span><span style="color: #007700">); </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.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> — Linux の syncfs システムコールが使えれば、それを呼ぶ</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); ?>