2024 年日本 PHP 研討會

簡介

此擴充套件透過 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();
?>
在上面的例子中,eio_rename() 請求可能會在 eio_symlink() 之前完成。要解決這個問題,您可以在 eio_symlink() 的回呼函式中呼叫 eio_rename()

範例 #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();
?>
群組是一種特殊的請求,可以累積一組常規的 *eio* 請求。這可以用於建立複雜的請求,例如開啟、讀取和關閉檔案。

從 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 介面也可以使用相同的功能 */
?>

新增註解

使用者貢獻的註解

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