• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

PHP中如何使用DirectIO

php 搞代码 4年前 (2022-01-04) 39次浏览 已收录 0个评论
文章目录[隐藏]

关于PHP的文件操作,我们也将是通过一系列的文章来进行学习。今天我们先学习的是一个很少人使用过,甚至很多人根本不知道的扩展,它与我们日常的文件操作有些许的不同。不过这些差别并不是我们肉眼所能直观看到的,主要还是在于业务的需求与性能的平衡。

什么是Direct IO

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] => 16<i style="color:transparent">来源gaodai$ma#com搞$代*码网</i>02643459
//     [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 中能够看到的信息类似,其实就是这个文件的一些简单的信息。

读取文件

读取文件使用非常简单的使用一个函数就可以完成。

$fd = dio_open("./test", O_RDWR | O_CREAT);

echo dio_read($fd), PHP_EOL;
// This is Test.I'm ZyBlog.Show me the money4i

dio_close($fd);

dio_read() 函数还包含另外一个参数,可以按指定的字节长度读取内容,这个在后面我们还会看到相关的示例。

文件操作

在文件的读取过程中,我们有可能只需要读取一部分的内容,或者从某一位置开始读取文件内容,下面的操作函数就是针对这两个方面进行操作的。

$fd = dio_open("./test", O_RDWR | O_CREAT);

var_dump(dio_truncate ($fd , 20)); 
// bool(true)
echo dio_read($fd), PHP_EOL;
// This is Test.I'm ZyB

dio_seek($fd, 3); 

echo dio_read($fd), PHP_EOL;
// s is Test.I'm ZyB

dio_close($fd);

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:PHP中如何使用DirectIO

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址