0

0

PHP中Direct IO扩展的安装使用

藏色散人

藏色散人

发布时间:2021-07-09 11:43:07

|

2172人浏览过

|

来源于segmentfault

转载

关于 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] => 1602643459
//     [mtime] => 1602656963
//     [ctime] => 1602656963
// )

dio_close($fd);

和 f 系列的函数类似,我们需要使用一个 dio_open() 函数来打开一个文件,O_RDWR | O_CREAT 参数的意思是打开一个可读写文件,并且如果文件不存在的话,创建它。这两个常量是与 Linux 中相关的直接操作文件的常量对应的,在文末的链接中也可以看到关于这些常量的解释。

写入操作也是同样的使用一个 dio_write() 就能够完成,它返回的内容是写入的内容长度,这里我们写入了 43 个字符。

立即学习PHP免费学习笔记(深入)”;

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

文件操作

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

php商城系统
php商城系统

PHP商城系统是国内功能优秀的网上商城系统,同时也是一个商业的PHP开发框架,有多套免费模版,强大的后台管理功能,专业的网上商城系统解决方案,快速建设网上购物商城、数码商城、手机商城、办公用品商城等网站。 php商城系统v3.0 rc6升级 1、主要修复用户使用中出现的js未加载完报错问题,后台整改、以及后台栏目的全新部署、更利于用户体验。 2、扩展出,更多系统内部的功能,以便用户能够迅速找到需

下载
$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);

其实从名称就可以看出 dio_truncate() 就是用于截断文件内容的。在这里我们从第 20 个字符进行截断,然后再使用 dio_read() 读取的内容就只是前 20 个字符的内容了。

dio_seek() 则是指定从哪一个字符开始读取内容,我们指定开始字符位置为 3 之后,前面三个字符就不会被读取到了。需要注意的是,dio_truncate() 会修改原始文件的内容,而 dio_seek() 则不会修改。

其它设置

$fd = dio_open('./test', O_RDWR | O_NOCTTY | O_NONBLOCK);

dio_fcntl($fd, F_SETFL, O_SYNC);

dio_tcsetattr($fd, array(
  'baud' => 9600,
  'bits' => 8,
  'stop'  => 1,
  'parity' => 0
));

while (($data = dio_read($fd, 4))!=false) {
    echo $data, PHP_EOL;
}
// This
//  is
// Test
// .I'm
//  ZyB

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视频教程

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2520

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1599

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1493

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

952

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1416

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1234

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1445

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1306

2023.11.13

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

36

2026.01.14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 8.6万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 6.9万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号