PHP8系列 | PHP8.1引入fsync函數/fdatasync函數的作用

簡介

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
/**
 * @desc fsync.php 描述信息
 * @author Tinywan(ShaoBo Wan)
 * @date 2022/2/25 10:52
 */
$file = 'fsync.txt';
$stream = fopen($file, 'w');
fwrite($stream, 'Tinywan');
fwrite($stream, "\r\n");
var_dump(fsync($stream)); // true
fclose($stream);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章