Próbuję utworzyć funkcję (w celach logowania)atomowo dołączanie linię do pliku i tworzenie go, jeśli nie istnieje
append($path, $data)
że
- tworzy $ file jeśli nie istnieje i atomically dołącza do niego dane $.
Musi
- wsparcia wysokiej współbieżności,
- wsparcia długich ciągów i
- być tak wydajnych jak to możliwe.
Dotychczas najlepszy próba jest:
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);
}
To działa OK, ale wydaje się być dość skomplikowane. Czy istnieje sposób czyszczenia (wbudowany?), Aby to zrobić?
Czy mogę zapytać, o co chodzi? – FtDRbwLXw6
Wierzę, że to nie będzie używało trybu "x" do otwierania pliku (O_EXCL w C-land), więc możesz mieć warunki wyścigu, jeśli plik nie istnieje. Zobacz https://github.com/php/php-src/blob/master/ext/standard/file.c (wygląda na to, że po prostu używa "c") –
30 ups i nie jest najlepszą odpowiedzią. biedny świat! ': (' –