此扩展通过 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 接口也可以使用相同的方法 */
?>