mirror of
https://github.com/php/doc-ja.git
synced 2026-03-24 15:12:22 +01:00
191 lines
5.8 KiB
XML
191 lines
5.8 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<!-- $Revision$ -->
|
|
<!-- EN-Revision: 4e53894013ec0d223e2723ece46447ba00d5baf5 Maintainer: takagi Status: ready -->
|
|
<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 I/O 機能を提供します。
|
|
Marc Lehmann による <link xlink:href="&url.eio.libeio;">libeio</link> C
|
|
ライブラリを利用します。
|
|
</simpara>
|
|
|
|
¬e.no-windows.extension;
|
|
|
|
<para>
|
|
|
|
<warning>
|
|
<simpara>
|
|
注意すべき点は、個々のリクエストが単一のスレッド内で実行され、
|
|
キューに入れた一連のリクエストの実行順は基本的に不定であるということです。
|
|
たとえば、次のコード片は間違っています。
|
|
</simpara>
|
|
</warning>
|
|
|
|
<example>
|
|
<title>間違ったリクエスト</title>
|
|
<programlisting role="php"><![CDATA[
|
|
<?php
|
|
// $filename のシンボリックリンクを $link に作るリクエスト
|
|
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> を
|
|
<function>eio_symlink</function> のコールバックの中から呼びます。
|
|
<example>
|
|
<title>リクエストコールバックからのリクエストの呼び出し</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();
|
|
}
|
|
|
|
// $filename のシンボリックリンクを $link に作るリクエスト
|
|
eio_symlink($filename, $link, EIO_PRI_DEFAULT, "my_symlink_done", $filename);
|
|
|
|
// リクエストを処理します
|
|
eio_event_loop();
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
|
|
あるいは、リクエストグループを作るという手もあります。
|
|
|
|
<example>
|
|
<title>リクエストコールバックからのリクエストの呼び出し</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 をコールバックに渡します
|
|
$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
|
|
-->
|