Atomares Anhängen einer Zeile an eine Datei und Erstellen, wenn sie nicht existiert

Lesezeit: 2 Minuten

Benutzer-Avatar
Jaka Jančar

Ich versuche, eine Funktion zu erstellen (zum Zwecke der Protokollierung)

append($file, $data)

das

  1. schafft $file wenn es nicht existiert und
  2. atomar anhängt $data dazu.

Es muss

  • hohe Parallelität unterstützen,
  • lange Saiten unterstützen und
  • so leistungsfähig wie möglich sein.

Bisher ist der beste Versuch:

function append($file, $data)
{
    // Ensure $file exists. Just opening it with 'w' or 'a' might cause
    // 1 process to clobber another's.
    $fp = @fopen($file, 'x');
    if ($fp)
        fclose($fp);
    
    // Append
    $lock = strlen($data) > 4096; // assume PIPE_BUF is 4096 (Linux)

    $fp = fopen($file, 'a');
    if ($lock && !flock($fp, LOCK_EX))
        throw new Exception('Cannot lock file: '.$file);
    fwrite($fp, $data);
    if ($lock)
        flock($fp, LOCK_UN);
    fclose($fp);
}

Es funktioniert OK, aber es scheint ziemlich komplex zu sein. Gibt es einen saubereren (integrierten?) Weg, dies zu tun?

Benutzer-Avatar
FtDRbwLXw6

PHP hat dafür bereits eine eingebaute Funktion, file_put_contents(). Die Syntax lautet:

file_put_contents($filename, $data, FILE_APPEND);

Beachten Sie, dass file_put_contents() erstellt die Datei, falls sie noch nicht existiert (sofern Sie über Dateisystemberechtigungen dafür verfügen).

  • Ich glaube, dies wird den Modus ‘x’ nicht zum Öffnen einer Datei verwenden (O_EXCL in C-Land), sodass Sie eine Race-Bedingung haben können, wenn eine Datei nicht existiert. Sehen github.com/php/php-src/blob/master/ext/standard/file.c (es sieht so aus, als würde es nur ‘c’ verwenden)

    – Jaka Jančar

    6. Mai 2013 um 21:37 Uhr

  • 30 Ups und keine beste Antwort. arme Welt! :(

    – Omar Tarik

    28. Dezember 2013 um 15:02 Uhr

  • Dies ist eine falsche Antwort. Dies beantwortet die Frage nicht richtig: Er fragt nach “Hängt $data atomar an”. und “unterstützt hohe Parallelität”. file_put_contents ist nicht sicher für gleichzeitige Schreibvorgänge.

    – John Boe

    14. Oktober 2019 um 12:02 Uhr


Verwenden der internen Funktion von PHP http://php.net/manual/en/function.file-put-contents.php

file_put_contents($file, $data, FILE_APPEND | LOCK_EX);

FILE_APPEND => Flag zum Anhängen des Inhalts an das Ende der Datei

LOCK_EX => Flag, um zu verhindern, dass jemand anderes gleichzeitig in die Datei schreibt (verfügbar seit PHP 5.1)

  • Dies ist eine bessere Lösung als die am meisten positiv bewertete.

    – Ilan Kleiman

    13. September 2019 um 5:21 Uhr


  • file_put_contents ist nicht sicher für gleichzeitige Schreibvorgänge.

    – John Boe

    14. Oktober 2019 um 12:04 Uhr


1216060cookie-checkAtomares Anhängen einer Zeile an eine Datei und Erstellen, wenn sie nicht existiert

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy