PHP Conference Japan 2024

dio_open

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

dio_open在比 C 库输入/输出流函数允许的更低的级别打开文件(如果必要则创建文件)

描述

dio_open(字符串 $filename, 整数 $flags, 整数 $mode = 0): 资源

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);
?>

参见

添加注释

用户贡献的注释 3 条注释

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 的“主要原因”是当您的应用程序提供自己的缓存功能时,这样您就不会进行双重缓存。
To Top