此扩展通过 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 接口使用 */
?>