Атомно добавляя строку в файл и создавая ее, если она не существует
Я пытаюсь создать функцию (для ведения журнала)
append($path, $data)
что
- создает $file, если он не существует, и
- атомарно добавляет к нему $data.
Он должен
- поддержка высокой concurrency,
- поддерживать длинные строки и
- быть максимально реалистичным.
Пока лучшая попытка:
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);
}
Он работает нормально, но он кажется довольно сложным. Есть ли более чистый (встроенный?) Способ сделать это?
Ответы
Ответ 1
У PHP уже есть встроенная функция, file_put_contents(). Синтаксис:
file_put_contents($filename, $data, FILE_APPEND);
Обратите внимание, что file_put_contents()
создаст файл, если он еще не существует (если у вас есть права на файловую систему).
Ответ 2
с использованием внутренней функции 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)