Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 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)