例
例1 リクエストの取り消し
<?php /* eio_nop() が終わったら呼ばれます */ function my_nop_cb($data, $result) { echo "my_nop ", $data, "\n"; }// この eio_nop() の呼び出しは取り消されます$req = eio_nop(EIO_PRI_DEFAULT, "my_nop_cb", "1");var_dump($req);eio_cancel($req);// この eio_nop() は処理されますeio_nop(EIO_PRI_DEFAULT, "my_nop_cb", "2");// リクエストを処理しますeio_event_loop();?>
上の例の出力は、 たとえば以下のようになります。
resource(4) of type (EIO Request Descriptor) my_nop 2
例2 eio_chmod() の呼び出し
<?php$temp_filename = dirname(__FILE__) ."/eio-temp-file.tmp";touch($temp_filename);/* eio_chmod() が終わったら呼ばれます */function my_chmod_callback($data, $result) { global $temp_filename; if ($result == 0 && !is_readable($temp_filename) && is_writable($temp_filename)) { echo "eio_chmod_ok"; } @unlink($temp_filename);}eio_chmod($temp_filename, 0200, EIO_PRI_DEFAULT, "my_chmod_callback");eio_event_loop();?>
上の例の出力は、 たとえば以下のようになります。
eio_chmod_ok
例3 カスタムリクエストの作成
<?php/* カスタムコールバック */function my_custom_callback($data, $result) { var_dump($data); var_dump(count($result)); var_dump($result['data_modified']); var_dump($result['result']);}/* カスタムリクエスト */function my_custom($data) { var_dump($data); $result = array( 'result' => 1001, 'data_modified' => "my custom data", ); return $result;}$data = "my_custom_data";$req = eio_custom("my_custom", EIO_PRI_DEFAULT, "my_custom_callback", $data);var_dump($req);eio_event_loop();?>
上の例の出力は、 たとえば以下のようになります。
resource(4) of type (EIO Request Descriptor) string(14) "my_custom_data" string(14) "my_custom_data" int(2) string(14) "my custom data" int(1001)
例4 リクエストのグループ化
<?php/* * ファイルを開き、読んでから閉じるグループリクエストを作ります */$temp_filename = dirname(__FILE__) ."/eio-file.tmp";$fp = fopen($temp_filename, "w");fwrite($fp, "some data");fclose($fp);/* グループリクエストが終了したときに呼ばれます */function my_grp_done($data, $result) { global $temp_filename; var_dump($result == 0); @unlink($temp_filename);}/* eio_open() が終わったら呼ばれます */function my_grp_file_opened_callback($data, $result) { global $my_file_fd, $grp; $my_file_fd = $result; var_dump($result > 0); // eio_read() リクエストを作ってグループに追加します $req = eio_read($my_file_fd, 4, 0, EIO_PRI_DEFAULT, "my_grp_file_read_callback"); eio_grp_add($grp, $req);}/* eio_read() が終わったら呼ばれます */function my_grp_file_read_callback($data, $result) { global $my_file_fd, $grp; var_dump($result); // eio_close() リクエストを作ってグループに追加します $req = eio_close($my_file_fd); eio_grp_add($grp, $req);}$grp = eio_grp("my_grp_done", "my_grp_data");// eio_open() リクエストを作ってグループに追加します$req = eio_open($temp_filename, EIO_O_RDWR | EIO_O_APPEND , NULL, EIO_PRI_DEFAULT, "my_grp_file_opened_callback", NULL);eio_grp_add($grp, $req);var_dump($grp);eio_event_loop();?>
上の例の出力は、 たとえば以下のようになります。
resource(6) of type (EIO Group Descriptor) bool(true) string(4) "some" bool(true)
例5 eio と libevent 拡張モジュールを組み合わせる
<?phpfunction my_eio_poll($fd, $events, $arg) { /* libevent の設定があればここに書きます .. */ if (eio_nreqs()) { eio_poll(); } /* .. そしてここにも書きます */}function my_nop_cb($d, $r) { var_dump($r); var_dump($d);}$base = event_base_new();$event = event_new();$fd = eio_get_event_stream();var_dump($fd);eio_nop(EIO_PRI_DEFAULT, "my_nop_cb", "nop data");eio_mkdir("/tmp/abc-eio-temp", 0750, EIO_PRI_DEFAULT, "my_nop_cb", "nop 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 インターフェイスでも同様にできます */?>
上の例の出力は、 たとえば以下のようになります。
int(3) int(0) string(8) "nop data" int(0) string(10) "mkdir data"
例6 eio と event 拡張モジュールを組み合わせる
<?php$base = new EventBase();// eio ポーリングストリームを取得します// この変数は、イベントループの実行中ずっと有効でなければいけないことに注意しましょう$eio_stream = eio_get_event_stream();// eio ポーリングストリームをイベントループにバインドします$poll_event = new Event($base, $eio_stream, Event::READ, function () { if (eio_nreqs()) { eio_poll(); }});$poll_event->add();// eio ジョブを追加しますeio_nop(EIO_PRI_DEFAULT, function () { echo "eio_nop\n";});// イベントを追加します$timer = Event::timer($base, function () { echo "2 seconds elapsed\n";});$timer->add(2);// イベントをディスパッチします$base->dispatch();?>
上の例の出力は、 たとえば以下のようになります。
eio_nop 2 seconds elapsed