ZetCode

PHP fdatasync 函数

最后修改于 2025 年 4 月 3 日

PHP 的 fdatasync 函数将文件数据同步到磁盘。它确保文件内容被物理写入存储设备。这对数据完整性至关重要。

基本定义

fdatasync 函数强制完成文件描述符的写操作。与 fflush 不同,它确保数据到达物理存储设备。

语法: fdatasync(resource $stream): bool。成功时返回 true,失败时返回 false。该函数需要一个有效的文件指针资源。

fdatasync 基本示例

这展示了 fdatasync 确保数据被写入的最简单用法。

basic_fdatasync.php
<?php

declare(strict_types=1);

$file = fopen('data.txt', 'w');
fwrite($file, 'Important data');
$result = fdatasync($file);
fclose($file);

var_dump($result); // Outputs: bool(true)

这会将数据写入文件并立即将其同步到磁盘。该函数返回 true,表示同步成功。

错误处理示例

这演示了在使用 fdatasync 时正确的错误处理方法。

error_handling.php
<?php

declare(strict_types=1);

$file = fopen('data.txt', 'w');
if ($file === false) {
    die('Failed to open file');
}

fwrite($file, 'Critical data');

if (!fdatasync($file)) {
    die('Failed to sync data to disk');
}

fclose($file);

它同时检查文件打开和同步是否成功。它确保数据在继续执行之前被安全地存储。

比较 fsync 和 fdatasync

此示例显示了 fsyncfdatasync 之间的区别。

sync_comparison.php
<?php

declare(strict_types=1);

$file = fopen('data.txt', 'w');
fwrite($file, 'Test data');

// Only synchronizes data, not metadata
$dataSync = fdatasync($file);

// Synchronizes both data and metadata
$fullSync = fsync($file);

fclose($file);

var_dump($dataSync, $fullSync); // Both output: bool(true)

fdatasync 速度更快,因为它不刷新元数据。fsync 提供更强的保证,但速度较慢。

数据库事务示例

这展示了 fdatasync 在数据库事务场景中的应用。

database_transaction.php
<?php

declare(strict_types=1);

function writeTransaction(string $filename, string $data): bool {
    $file = fopen($filename, 'a');
    if ($file === false) return false;
    
    if (fwrite($file, $data) === false) {
        fclose($file);
        return false;
    }
    
    if (!fdatasync($file)) {
        fclose($file);
        return false;
    }
    
    return fclose($file);
}

$success = writeTransaction('transactions.log', 'TX123:500.00');
var_dump($success); // Outputs: bool(true)

这确保事务数据在继续之前被安全地存储。这对于财务或重要的日志记录操作至关重要。

性能注意事项

此示例衡量了 fdatasync 的性能影响。

performance_test.php
<?php

declare(strict_types=1);

$start = microtime(true);
$file = fopen('perf_test.txt', 'w');

for ($i = 0; $i < 1000; $i++) {
    fwrite($file, "Line $i\n");
    if ($i % 100 === 0) {
        fdatasync($file);
    }
}

fclose($file);
$duration = microtime(true) - $start;

echo "Execution time: " . round($duration, 4) . " seconds";

这展示了频繁同步如何影响性能。该示例通过每 100 次写入进行同步来平衡数据安全性和性能。

最佳实践

来源

PHP fdatasync 文档

本教程涵盖了 PHP 的 fdatasync 函数,并提供了实际示例,展示了它在不同场景中的用法。

作者

我叫 Jan Bodnar,是一位充满激情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。到目前为止,我撰写了超过 1,400 篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出 所有 PHP 文件系统函数