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);