Direct IO 其实是 Linux 操纵系统中的一个概念。它的意思是直接操纵文件流,为什么说是直接呢?其着实我们的操纵系统进行文件操纵的时候,并不是马上直接就在磁盘上进行文件的读写,中心还有一层页缓存。既然是缓存,那么它固然是会带来一定的性能提拔,但这也并不是完全绝对的。而直接操纵就是忽略掉这一层的缓存操纵,直接对磁盘上的文件进行读写。我们都知道,磁盘,即使是固态硬盘,它和 CPU 以及内存的处理速率之间都是有着巨大的落差的,默认的页缓存就是用来弥补这种差距。但是页缓存会加大 CPU 的运算操纵以及占用内存,而直接操纵则不会有这种题目,但是相对来说,它的速率并不能和带缓存的文件读取操纵相媲美。
以上是关于 Direct IO 的一个简朴的理解,更过细的表明大家可以参考文末参考文档中第二条链接的内容并进行深入的学习。在 PHP 中,我们直接在 PECL 下载 Direct IO 扩展就可以按照扩展的正常安装方式进行安装利用。
创建写入文件
既然是文件操纵,那么我们起首还是来创建和写入一些文件数据。
$fd = dio_open("./test", O_RDWR | O_CREAT);
echo dio_write($fd, "This is Test.I'm ZyBlog.Show me the money4i"), PHP_EOL;
// 43
print_r(dio_stat($fd));
// Array
// (
// [device] => 64768
// [inode] => 652548
// [mode] => 35432
// [nlink] => 1
// [uid] => 0
// [gid] => 0
// [device_type] => 0
// [size] => 43
// [block_size] => 4096
// [blocks] => 8
// [atime] => 1602643459
// [mtime] => 1602656963
// [ctime] => 1602656963
// )
dio_close($fd);
复制代码
和 f 系列的函数雷同,我们须要利用一个 dio_open() 函数来打开一个文件,O_RDWR | O_CREAT 参数的意思是打开一个可读写文件,并且假如文件不存在的话,创建它。这两个常量是与 Linux 中相干的直接操纵文件的常量对应的,在文末的链接中也可以看到关于这些常量的表明。
写入操纵也是同样的利用一个 dio_write() 就可以或许完成,它返回的内容是写入的内容长度,这里我们写入了 43 个字符。
dio_stat() 是返回当前文件句柄的一些信息,我们可以看到设备号 device 、uid 、 gid 、 atime 、 mtime 等一些信息,它们和我们在 Linux 中可以或许看到的信息雷同,其实就是这个文件的一些简朴的信息。
读取文件