Атомно добавляя строку в файл и создавая ее, если она не существует

Я пытаюсь создать функцию (для целей ведения журнала)

append($path, $data) 

что

  1. создает $ file, если он не существует и
  2. атомарно добавляет к нему $ data.

Он должен

  • поддерживать высокий уровень параллелизма,
  • поддерживать длинные строки и
  • быть максимально реалистичным.

Пока что лучшая попытка:

 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); } 

Он работает нормально, но он кажется довольно сложным. Есть ли более чистый (встроенный?) Способ сделать это?

PHP уже имеет встроенную функцию для этого, file_put_contents () . Синтаксис:

 file_put_contents($filename, $data, FILE_APPEND); 

Обратите внимание, что file_put_contents() создаст файл, если он еще не существует (если у вас есть разрешения файловой системы).

с использованием внутренней функции PHP http://php.net/manual/en/function.file-put-contents.php

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

FILE_APPEND =>, чтобы добавить содержимое в конец файла

LOCK_EX =>, чтобы запретить кому-либо еще писать файл в одно и то же время (доступно с PHP 5.1)