2024 日本 PHP 研討會

範例

範例 #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
/*
* Create a group request to open, read and close a file
*/

$temp_filename = dirname(__FILE__) ."/eio-file.tmp";
$fp = fopen($temp_filename, "w");
fwrite($fp, "some data");
fclose($fp);

/* Is called when the group requests are done */
function my_grp_done($data, $result) {
global
$temp_filename;
var_dump($result == 0);
@
unlink($temp_filename);
}

/* Is called when eio_open() done */
function my_grp_file_opened_callback($data, $result) {
global
$my_file_fd, $grp;

$my_file_fd = $result;

var_dump($result > 0);

// Create eio_read() request and add it to the group
$req = eio_read($my_file_fd, 4, 0, EIO_PRI_DEFAULT, "my_grp_file_read_callback");
eio_grp_add($grp, $req);
}

/* Is called when eio_read() done */
function my_grp_file_read_callback($data, $result) {
global
$my_file_fd, $grp;

var_dump($result);

// Create eio_close() request and add it to the group
$req = eio_close($my_file_fd);
eio_grp_add($grp, $req);
}

$grp = eio_grp("my_grp_done", "my_grp_data");

// Create eio_open() request and add it to the group
$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 搭配 libevent 擴充套件使用 eio

<?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", 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 秒經過\n";
});
$timer->add(2);

// 派送事件。
$base->dispatch();
?>

上述範例將會輸出類似以下的內容

eio_nop
2 seconds elapsed
 

新增註記

使用者貢獻的註記

此頁面沒有使用者貢獻的註記。
To Top