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