Direct IO:
简介:
PHP支持直接的IO(输入输出)函数,正如Posix标准描述的,这些I/O函数相对于C语言的I/O流函数(例如:fopen(),fread())更底层。只有当需要直接控制设备,才考虑使用这些DIO函数。其它情况,我们之前熟知的 'filesystem' 函数已经足够了。
安装:
安装PECL扩展:http://pecl.php.net/package/dio
预定义常量:
很多,查看手册
函数:
1.dio_open(string $filename, int $flags[, int $mode = 0])
打开一个文件(必要时候创建),比C提供的I/O流函数库更底层,返回新的文件描述符
参数:
$filename - 打开的文件路径
$flags - flags参数是一个按位异或值,由下面列表的标识组成。flags必须包含 'O_RDONLY'、'O_WRONLY'或'O_WRONLY'中的一个。此外,它还可以同列表中的任何其它标识组合。
O_RDONLY - 以读权限打开文件
O_WRONLY - 以写权限打开文件
O_RDWR - 以读和写权限打开文件
O_CREAT - 如果文件不存在,则创建
O_EXCL - 如果同时设置了 'O_EXCL' 和 'O_CREAT' 标志,并且文件已经存在,则 'dio_open()' 失败
O_TRUNC - 如果文件存在,并且已经通过写权限打开,将会清空(truncate - 数据库中truncate表)文件!
O_APPEND - 追加写入数据到文件末尾
O_NONBLOCK - 设置 '非阻塞' 模式
O_NOCTTY - 当打开一个 'TTY' 设备文件,防止操作系统将打开的文件分配为进程的控制终端
$mode
1.如果flags包含 'O_CREAT',mode用来设置文件的权限(0777等)。当在flags中指定了 'O_CREAT',为了操作正确需要设置mode,其它情况忽略mode。
2.分配给创建的文件的实际权限将由进程的umask设置一如既往的影响
示例:
<?php
$fd = dio_open('/dev/ttyS0', O_RDWR | O_NOCTTY | O_NONBLOCK);
dio_close($fd);
?>
2.dio_close(resource $fd)
关闭指定的文件描述符
3.dio_read(resource $fd[, int $len = 1024])
从打开的文件中,读取指定长度的数据
4.dio_write(resource $fd, string $data[, int $len = 0])
向打开的文件中,写入数据
参数:
$fd - 打开的文件资源
$data - 写入的数据
$len - 指定写入的数据的长度,未指定,则写入全部数据
5.dio_seek(resource $fd, int $pos[, int $whence = SEEK_SET])
改变打开的文件描述符的指针位置
参数:
$fd - 打开的文件资源
$pos - 新的指针位置
$whence - 指定指定位置如何移动
SEEK_SET - 指针位置从文件开头移动
SEEK_CUR - 指针位置从当前位置开始移动。所以就存在一个向前移动还是向后移动。可设置 $pos 为 '+' | '-'。
SEEK_END - 指针位置从文件结尾移动。也可设置 $pos 为 '+' | '-'。设置为 '-',表示还在当前的文件范围内,向前移动。设置为 '+',表示越过当前文件的结尾,实际上就是在写入数据,一直填充0,直到指定的 $pos 个0。
6.dio_truncate(resource $fd, int $offset)
1.截断文件到$offset设置的尺寸大小,单位为 bytes
2.如果文件尺寸>$offset,额外的数据将丢失。如果文件尺寸<$offset,未具体说明文件是不改变,还是被扩展(即填充0)
7.dio_stat(resource $fd)
返回打开的文件描述符信息,错误返回NULL,正确返回一个关联数组:
device - 设备
inode - 文件的inode
mode - 文件权限(0777)
nlink - 硬链接数量
uid - 所有者
gid - 所属组
device_type - 设备类型
size - 文件大小,单位bytes
blocksize - block块大小(存储内容的最小单位)
blocks - 分配的block块数量
atime - 最后访问时间
mtime - 最后修改时间
ctime - 内容最后改变时间
8.dio_tcsetattr(resource $fd, array $options)
设置打开文件的终端属性和波特率(传输速率)
参数:
$fd - 打开的文件描述符
$options - 当前可用的options有:
baud - 端口的波特率(传输速率),可设置为:38400,19200,9600,4800,2400,1800, 1200,600,300,200,150,134,110,75,50。默认是9600
bits - 数据位(data bits),可设置为:8,7,6,5。默认是8
stop - 停止位(stop bits),可设置为:1,2。默认是1
parity - (奇偶校验?)可设置为:0,1,2。默认是0
9.dio_fcntl(resource $fd, int $cmd[, mixed $args])
该函数在打开的文件描述符上,执行 '$cmd' 指定的操作。一些命令需要额外的参数,由$args来提供
参数:
$fd - 打开的文件描述符
$cmd - 可以是下面操作的一个:
F_SETLK - 设置锁定|清除锁定。如果某人设置了锁定,dio_fcntl()返回-1
F_SETLKW - 同 'F_SETLK' 类似,区别是:当某人设置了锁定,dio_fcntl()等待,直到锁定被释放
F_GETLK - dio_fcntl()返回一个关联数组,如果别的人设置了锁定。如果未设置锁定,关联数组的键 'type',将设置为 'F_UNLCK'
F_DUPFD - 查找大于或等于$args的最少数量的可用的文件描述符,并返回
F_SETFL - 设置文件描述符标志为$args指定的值,可以是:O_APPEND,O_NONBLOCK, O_ASYNC。为了使用 'O_ASYNC',需要使用 'PCNTL' 扩展。
$args - args是一个关联数组,当$cmd是 'F_SETLK' | 'F_SETLLW',可使用下面的键
start - 锁定开始的偏移(offset)位置。
length - 锁定的区域大小。0表示锁定到文件结尾
whence - 锁定开始的相对位置,可以是:SEEK_SET, SEEK_END, SEEK_CUR(上面有的函数说明过了,可查看)
type - 锁定的类型,可以是:F_RDLCK-读锁定, F_WRLCK(写锁定), F_UNLCK(解锁)
Direct IO
最新推荐文章于 2021-05-25 19:12:02 发布