简介

此扩展通过 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