Position actuelle: Accueil> Derniers articles> Comment utiliser la fonction FSYNC en combinaison avec le troupeau pour assurer l'atomicité et la sécurité des opérations de fichiers?

Comment utiliser la fonction FSYNC en combinaison avec le troupeau pour assurer l'atomicité et la sécurité des opérations de fichiers?

M66 2025-06-26

Lorsque vous effectuez des opérations de fichiers en PHP, il est très important d'assurer l'atomicité et la sécurité des opérations, en particulier dans des environnements multi-processus ou multi-thread. La fonction Flock () et la fonction fSync () sont deux outils couramment utilisés. Ils peuvent assurer efficacement l'intégrité des opérations de fichiers et éviter la concurrence des données et écrire des pertes. Cet article présentera en détail le rôle de ces deux fonctions et comment les utiliser raisonnablement.

1. Fonction Flock () : l'implémentation du verrouillage de fichiers

La fonction Flock () est utilisée pour verrouiller les fichiers pour éviter que plusieurs processus de modifier le même fichier en même temps, entraînant une confusion de données. Il fournit deux types de verrouillage: Lock partagé ( LOCK_SH ) et Lock exclusif ( LOCK_EX ).

  • Lock partagé (LOCK_SH) : permet à plusieurs processus de lire des fichiers, mais ne permet pas d'écrire.

  • Lock exclusif (LOCK_EX) : verrouillage exclusif, permettant à un processus d'écrire des fichiers, tandis que d'autres processus ne peuvent pas lire et écrire.

Exemple de code:

 <?php
$fp = fopen('data.txt', 'c+');
if (flock($fp, LOCK_EX)) { // Ajouter un verrouillage exclusif
    // Effectuer des opérations d&#39;écriture de fichiers
    fwrite($fp, "Écrire des données\n");
    fflush($fp); // Écrivez des données de tampon au système de fichiers
    flock($fp, LOCK_UN); // Relâchez le verrouillage
}
fclose($fp);
?>

2. FONCTION FSYNC () : Écriture forcée au disque

PHP lui-même ne fournit pas directement la fonction FSYNC () , mais le tampon peut être actualisé à l'aide de la fonction fflush () , et FSync () est un appel système pour s'assurer que le système d'exploitation écrit les données mises en cache du noyau sur disque. Bien que Fflush () rincera le tampon, il ne peut garantir que les données de disque seront persistées. Dans l'environnement Linux, il peut être implémenté via Stream_get_Meta_Data et FSTAT avec POSIX_FSYNC (nécessite une prise en charge d'extension).

Exemple d'appel (dans un environnement pris en charge):

 <?php
$fp = fopen('data.txt', 'c+');
if (flock($fp, LOCK_EX)) {
    fwrite($fp, "Écrire des données\n");
    fflush($fp);
    // posix_fsyncAssurez-vous que les données sont écrites sur le disque
    if (function_exists('posix_fsync')) {
        posix_fsync($fp);
    }
    flock($fp, LOCK_UN);
}
fclose($fp);
?>

3. Combiner Flock () et FSync () pour assurer l'atomicité et la sécurité des opérations de fichiers

  • Atomicité : Flock () garantit qu'un seul processus peut écrire dans le fichier en même temps, en évitant la concurrence des données.

  • Sécurité : utilisez fflush () et fsync () (ou fonctions similaires) pour vous assurer que les données sont écrites sur le disque, empêchant les données de perdre en raison de plantages système ou de défaillances de puissance.

Exemple complet:

 <?php
$file = '/path/to/data.txt';
$fp = fopen($file, 'c+');
if (!$fp) {
    die('Impossible d&#39;ouvrir le fichier');
}

if (flock($fp, LOCK_EX)) {
    // Déplacer le pointeur de fichier vers la fin du fichier,Évitez la couverture
    fseek($fp, 0, SEEK_END);
    fwrite($fp, "安全Écrire des données\n");
    fflush($fp); // VolontéPHPLes données de tampon sont écrites dans le cache du système d&#39;exploitation

    // Dans les environnements système pris en charge,utiliserfsync系统调用Volonté数据写入磁盘
    if (function_exists('posix_fsync')) {
        posix_fsync($fp);
    }

    flock($fp, LOCK_UN);
} else {
    echo "Impossible d&#39;obtenir un verrouillage de fichiers";
}

fclose($fp);
?>

4. Résumé

  • Flock () assure l'atomicité des opérations de fichiers simultanées par le mécanisme de verrouillage pour éviter l'incorrection des données lors des écritures simultanées.

  • Ffflush () et fSync () s'assurent que les données sont écrites du tampon de programme au cache du système d'exploitation, puis synchronisée sur le disque, améliorant la sécurité des données.

  • La combinaison des deux peut réduire considérablement les risques dans le processus d'écriture de fichiers et convient à des scénarios tels que l'écriture de journaux et les mises à jour de fichiers de configuration qui nécessitent une écriture sûre.

Si vous devez assurer la stabilité et la sécurité des opérations de fichiers en développement, il est recommandé d'utiliser Flock () avec l'idée de fSync () .


 <?php
$file = 'https://m66.net/path/to/data.txt';
$fp = fopen($file, 'c+');
if (!$fp) {
    die('Impossible d&#39;ouvrir le fichier');
}

if (flock($fp, LOCK_EX)) {
    fseek($fp, 0, SEEK_END);
    fwrite($fp, "安全Écrire des données\n");
    fflush($fp);

    if (function_exists('posix_fsync')) {
        posix_fsync($fp);
    }

    flock($fp, LOCK_UN);
} else {
    echo "Impossible d&#39;obtenir un verrouillage de fichiers";
}

fclose($fp);
?>