dio_open

(PHP 4 >= 4.2.0, PHP 5 < 5.1.0)

dio_open打开一个文件(如果必要,则创建它),其级别低于 C 库输入/输出流函数允许的级别

描述

dio_open(string $filename, int $flags, int $mode = 0): resource

dio_open() 打开一个文件并返回一个新的文件描述符。

参数

filename

要打开的文件的路径名。

flags

参数 flags 是一个按位或运算的值,包含以下列表中的标志。此值**必须**包含以下其中一个:O_RDONLYO_WRONLYO_RDWR。此外,它还可以包含从该列表中其他标志的任何组合。

  • O_RDONLY - 以只读方式打开文件。

  • O_WRONLY - 以只写方式打开文件。

  • O_RDWR - 以读写方式打开文件。

  • O_CREAT - 创建文件,如果文件不存在。

  • O_EXCL - 如果同时设置了 O_CREATO_EXCL 并且文件已经存在,则 dio_open() 将失败。

  • O_TRUNC - 如果文件存在并以写方式打开,则文件将被截断为零长度。

  • O_APPEND - 写入操作将数据写入文件末尾。

  • O_NONBLOCK - 设置非阻塞模式。

  • O_NOCTTY - 阻止操作系统在打开 TTY 设备文件时将打开的文件分配为进程的控制终端。

mode

如果 flags 包含 O_CREAT,则 mode 将设置文件的权限(创建权限)。当在 flags 中指定 O_CREAT 时,需要 mode 进行正确操作,否则将被忽略。

分配给创建文件的实际权限将受到进程的umask设置的影响,与往常一样。

返回值

一个文件描述符或错误时为 false

示例

示例 #1 打开一个文件描述符

<?php

$fd
= dio_open('/dev/ttyS0', O_RDWR | O_NOCTTY | O_NONBLOCK);

dio_close($fd);
?>

参见

添加备注

用户贡献的备注 4 个备注

j at pureftpd dot org
19 年前
请注意,对于文件,dio_open()/dio_write()/dio_close() 比 fopen()/fwrite()/fclose() *更快*。

fwrite() 必须管理一个 8k 缓冲区,而 dio_write() 只发出一个写入请求。最终的结果是减少了系统调用和内存访问。

此外,与 dio_write() 一样,将完整大小传递给 write() 使文件系统能够正确使用预分配,以避免碎片。
Marius Karthaus
14 年前
使用直接 I/O 的一个主要原因是它能够执行真正的直接 I/O,绕过操作系统缓存并直接从磁盘获取数据。
执行此操作的标志(O_DIRECT)在上面的文档中缺失。也许有充分的理由,因为这种类型的 I/O 仅适用于块设备,不适用于文件,并且只有在你**非常**确定自己在做什么时才应该使用它。
匿名
12 年前
使用直接 I/O 的“主要原因”是当你的应用程序提供自己的缓存功能时,这样你就不会进行双重缓存
alla at cyber dot com dot au
21 年前
要指定标志的组合,请将它们按位或运算。
这是我唯一能够让它追加的方式

$fd = dio_open($file, O_WRONLY | O_APPEND);
To Top