此擴充套件透過 Marc Lehmann 撰寫的 » libeio C 函式庫提供非同步 POSIX I/O。
注意:此擴充套件在 Windows 平台上不可用。
務必注意每個請求都在一個執行緒中執行,連續佇列請求的執行順序基本上是不可預測的。例如,以下程式碼片段是不正確的。
範例 #1 不正確的請求
<?php
// 請求建立 $filename 到 $link 的符號連結
eio_symlink($filename, $link);
// 請求將 $filename 移動到 $new_filename
eio_rename($filename, $new_filename);
// 處理請求
eio_event_loop();
?>
範例 #2 從請求回呼函式中呼叫請求
<?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();
?>
範例 #3 從請求回呼函式中呼叫請求
<?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();
?>
從 0.3.0 alpha 版本開始,可以使用 eio_get_event_stream() 擷取內部與 libeio 進行通訊的變數。此變數可用於綁定到其他擴充套件支援的事件迴圈。您可以組織一個簡單的事件迴圈,讓 eio 和 libevent 協同工作。
範例 #4 結合使用 eio 和 libevent
<?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 介面也可以使用相同的功能 */
?>