当前位置:首页 > PHP > 正文内容

php8.1引入fsync函数/fdatasync函数的作用

高老师4年前 (2022-01-07)PHP2289

php8.1引入了了两个函数,分别为fsync和fdatasync,主要是为了PHP提供更强大IO控制能力。我们通常使用fwrite函数来对文件进行写入操作,我们认为该函数一旦返回成功,数据便已经写到了文件中,事实上是不太正确的。文件的write操作,更新的只是内存中的页缓存,而脏页不会立即更新到硬盘中,而是由操作系统统一调度。

于是一般情况下我们的写入操作如下:

(1).数据复制到其中一个缓冲区中,缓冲区未满不会动

(2).缓存区满了再将该缓冲排入到输出队列,数据到达队首时,才进行实际的I/O操作

因此很多时候我们的程序只是走到第一步,其他的由操作系统来自行处理。

但是很多应用程序对文件写入的要求非常高,不允许丢失数据,比如数据库。于是UNIX提供了3个api,分别是sync/fsync/fdatasync函数。

sync函数:

sync函数主动将所有修改过的块缓冲区排入写队列就完事儿,剩下的由操作系统来

fsync函数:

fsync函数只对由文件描述符filedes指定的单一文件起作用,并且等待写磁盘操作结束,然后返回。(非常适合数据库,一定能保证写入到磁盘)

fdatasync函数:

fdatasync函数类似于fsync,但它只影响文件的数据部分。而除数据外,fsync还会同步更新文件的属性。

因此对于PHP8.1版本文件写入有要求的可以使用新的api了:

<?php
$file = 'gao.txt';
$stream = fopen($file, 'w');
fwrite($stream, '高三峰');
fwrite($stream, "\r\n");
fsync($stream);
fclose($stream);

扫描二维码推送至手机访问。

版权声明:本文由高久峰个人博客发布,如需转载请注明出处。

本文链接:https://blog.20230611.cn/post/214.html

分享给朋友:

“php8.1引入fsync函数/fdatasync函数的作用” 的相关文章

php scoket,php webscoket,php webscoket 服务器

php scoket,php webscoket,php webscoket 服务器

项目需要使用websocket推送最新订单,客户服务器非linux不支持swoole,因此使用原生,直接上代码(1).PHP服务端<?php ini_set('error_reporting', E_ALL ^ E_NOTICE); ini_set...

PHP二维数组排序,PHP多维数组排序, array_multisort()

PHP二维数组排序,PHP多维数组排序, array_multisort()

使用php函数array_multisort()即可实现和SQL一样的order by排序. 例如我们需要对会员表按照主键降序排列,年龄升序排列://会员表数据 $list = []; $list[] = ['mid' =>&n...

php异步信号处理

php异步信号处理

php7.1引入了PHP异步信号处理函数pcntl_async_signals() 来处理阻塞问题。在php7之前信号处理方式有2种,第一种是基于ticks来每执行一行代码来触发执行信号监听,第二种是直接while(true){  //监听信号 }第一种方式如果某行的代码阻塞时间较长会影响...

php下载远程文件(支持断点续传,支持超大文件)

php下载远程文件(支持断点续传,支持超大文件)

断点下载的原理:http请求头添加Range参数告诉文件服务器端需要的字节范围例如1个文本文件的字节为1000,第一次请求Range: bytes=0-500第二次请求Range: bytes=501-1000通过每次的请求将返回的流追加写入到文件。注意的项目:断点下载服务器端的每次只返回字节传输的...

php redis事务

php redis事务

概念请参考w3school文章: redis watch ,redis exec (看完基本秒懂)(1)基本事务://连接本地的 Redis 服务 $redis = new Redis(); $redis->con...

在MyISAM引擎中使用事务会怎样

在MyISAM引擎中使用事务会怎样

众所周知MyISAM引擎不支持事务,但是我只是知道不支持事务,并未测试具体的表现是什么,测试代码如下:try {     //开启事务     Db::startTrans();    &...