Eio
PHP Manual

例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 == && !is_readable($temp_filename) && is_writable($temp_filename)) {
        echo 
"eio_chmod_ok";
    }

    @
unlink($temp_filename);
}

eio_chmod($temp_filename0200EIO_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_fd40EIO_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_filenameEIO_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 拡張モジュールを組み合わせる

<?php
function 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"0750EIO_PRI_DEFAULT"my_nop_cb""nop data");
/* その他の eio_* コール ... */


// イベントフラグを設定します
event_set($event$fdEV_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_streamEvent::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
 


Eio
PHP Manual