• 售前

  • 售后

热门帖子
入门百科

PHP中DirectIO操作文件扩展的用法大全

[复制链接]
ffycxyw2274436 显示全部楼层 发表于 2021-8-14 14:45:01 |阅读模式 打印 上一主题 下一主题
关于 PHP 的文件操纵,我们也将是通过一系列的文章来进行学习。今天我们先学习的是一个很少人利用过,甚至很多人根本不知道的扩展,它与我们日常的文件操纵有些许的差别。不过这些差异并不是我们肉眼所能直观看到的,重要还是在于业务的需求与性能的平衡。
什么是Direct IO

Direct IO 其实是 Linux 操纵系统中的一个概念。它的意思是直接操纵文件流,为什么说是直接呢?其着实我们的操纵系统进行文件操纵的时候,并不是马上直接就在磁盘上进行文件的读写,中心还有一层页缓存。既然是缓存,那么它固然是会带来一定的性能提拔,但这也并不是完全绝对的。而直接操纵就是忽略掉这一层的缓存操纵,直接对磁盘上的文件进行读写。我们都知道,磁盘,即使是固态硬盘,它和 CPU 以及内存的处理速率之间都是有着巨大的落差的,默认的页缓存就是用来弥补这种差距。但是页缓存会加大 CPU 的运算操纵以及占用内存,而直接操纵则不会有这种题目,但是相对来说,它的速率并不能和带缓存的文件读取操纵相媲美。
以上是关于 Direct IO 的一个简朴的理解,更过细的表明大家可以参考文末参考文档中第二条链接的内容并进行深入的学习。在 PHP 中,我们直接在 PECL 下载 Direct IO 扩展就可以按照扩展的正常安装方式进行安装利用。
创建写入文件

既然是文件操纵,那么我们起首还是来创建和写入一些文件数据。
  1. $fd = dio_open("./test", O_RDWR | O_CREAT);
  2. echo dio_write($fd, "This is Test.I'm ZyBlog.Show me the money4i"), PHP_EOL;
  3. // 43
  4. print_r(dio_stat($fd));
  5. // Array
  6. // (
  7. //     [device] => 64768
  8. //     [inode] => 652548
  9. //     [mode] => 35432
  10. //     [nlink] => 1
  11. //     [uid] => 0
  12. //     [gid] => 0
  13. //     [device_type] => 0
  14. //     [size] => 43
  15. //     [block_size] => 4096
  16. //     [blocks] => 8
  17. //     [atime] => 1602643459
  18. //     [mtime] => 1602656963
  19. //     [ctime] => 1602656963
  20. // )
  21. dio_close($fd);
复制代码
和 f 系列的函数雷同,我们须要利用一个 dio_open() 函数来打开一个文件,O_RDWR | O_CREAT 参数的意思是打开一个可读写文件,并且假如文件不存在的话,创建它。这两个常量是与 Linux 中相干的直接操纵文件的常量对应的,在文末的链接中也可以看到关于这些常量的表明。
写入操纵也是同样的利用一个 dio_write() 就可以或许完成,它返回的内容是写入的内容长度,这里我们写入了 43 个字符。
dio_stat() 是返回当前文件句柄的一些信息,我们可以看到设备号 device 、uid 、 gid 、 atime 、 mtime 等一些信息,它们和我们在 Linux 中可以或许看到的信息雷同,其实就是这个文件的一些简朴的信息。
读取文件

读取文件利用非常简朴的利用一个函数就可以完成。
  1. $fd = dio_open("./test", O_RDWR | O_CREAT);
  2. echo dio_read($fd), PHP_EOL;
  3. // This is Test.I'm ZyBlog.Show me the money4i
  4. dio_close($fd);
复制代码
dio_read() 函数还包罗别的一个参数,可以按指定的字节长度读取内容,这个在后面我们还会看到相干的示例。
文件操纵

在文件的读取过程中,我们有大概只须要读取一部门的内容,或者从某一位置开始读取文件内容,下面的操纵函数就是针对这两个方面进行操纵的。
  1. $fd = dio_open("./test", O_RDWR | O_CREAT);
  2. var_dump(dio_truncate ($fd , 20));
  3. // bool(true)
  4. echo dio_read($fd), PHP_EOL;
  5. // This is Test.I'm ZyB
  6. dio_seek($fd, 3);
  7. echo dio_read($fd), PHP_EOL;
  8. // s is Test.I'm ZyB
  9. dio_close($fd);
复制代码
其实从名称就可以看出 dio_truncate() 就是用于截断文件内容的。在这里我们从第 20 个字符进行截断,然后再利用 dio_read() 读取的内容就只是前 20 个字符的内容了。
dio_seek() 则是指定从哪一个字符开始读取内容,我们指定开始字符位置为 3 之后,前面三个字符就不会被读取到了。须要留意的是,dio_truncate() 会修改原始文件的内容,而 dio_seek() 则不会修改。
其它设置
  1. $fd = dio_open('./test', O_RDWR | O_NOCTTY | O_NONBLOCK);
  2. dio_fcntl($fd, F_SETFL, O_SYNC);
  3. dio_tcsetattr($fd, array(
  4.   'baud' => 9600,
  5.   'bits' => 8,
  6.   'stop'  => 1,
  7.   'parity' => 0
  8. ));
  9. while (($data = dio_read($fd, 4))!=false) {
  10.     echo $data, PHP_EOL;
  11. }
  12. // This
  13. //  is
  14. // Test
  15. // .I'm
  16. //  ZyB
  17. dio_close($fd);
复制代码
dio_fcntl() 函数是调用的 c 函数库中的 fcntl 函数,目标是对文件形貌符实行指定的一些操纵,这个操纵也是以一些常量进行固定的,在这里我们利用的是 F_SETFL ,它的意思是将文件形貌符标记设置为指定的值,这个 O_SYNC 表现的是假如设置了这个形貌符,则对该文件的写操盘会等到数据被写到磁盘上才竣事。固然,这个函数还可以设置很多别的操纵符,大家可以参考 PHP 的官方文档进行深入的学习。
dio_tcsetattr() 用于设置打开文件的终端属性和波特率。 baud 表现的就是波特率,bits 表现的是位,stop 表现的是克制位,parity 表现的是奇偶校验位。关于这方面的内容须要 《计算机构成原理》 及 《操纵系统》 中的一些知识,我也并不十分地清晰,所以也就不详细的表明了。从这里就可以看出,大学讲堂上的那些根本课程真的是非常地告急,信赖好勤学过这些专业根本课程的同砚一定能马上明确这个函数的作用。
最后,我们在 dio_read() 中利用了第二个参数来根据字节长度读取文件内容,可以看到读取出来的内容是一段一段的以 4 个字符长度为单位的输出。
总结

函数的学习还是比力简朴的,焦点的还是要知道这个扩展在什么业务场景下更适合利用。在文章开头的先容中我们已经说明了直接操纵文件与平凡文件操纵的一些区别,在自缓存应用或者须要传输非常大的数据时,直接操尴尬刁难于 CPU 和 内存 更加地友爱。而其它环境,我们还是利用系统默认的文件操纵方式就可以了。其着实大部门环境下,我们根本看不出来它们的显著区别。所以在实际应用中,还是那句话,团结业务实际环境,选择最佳的方案。
测试代码:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202010/source/4.PHP中DirectIO直操纵文件扩展的利用.php
参考文档:
https://www.php.net/manual/zh/book.dio.php
https://www.ibm.com/developerworks/cn/linux/l-cn-directio/
到此这篇关于PHP中DirectIO直操纵文件扩展的利用的文章就先容到这了,更多相干php扩展的利用内容请搜索草根技术分享从前的文章或继承欣赏下面的相干文章希望大家以后多多支持草根技术分享!

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作