以原子方式将一行添加到文件中,如果该文件不存在则创建该文件

时间:2012-02-01 13:20:05

标签: php

我正在尝试创建一个函数(用于记录)

append($path, $data)

  1. 创建$ file(如果它不存在)
  2. 原子地向其添加$ data。
  3. 必须

    • 支持高并发,
    • 支持长字符串和
    • 尽可能高效。

    到目前为止,最好的尝试是:

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

    它运作正常,但似乎相当复杂。是否有清洁(内置?)的方式来做它?

2 个答案:

答案 0 :(得分:77)

PHP已经有一个内置函数来执行此操作,file_put_contents()。语法是:

file_put_contents($filename, $data, FILE_APPEND);

请注意,如果文件尚不存在,file_put_contents()将创建该文件(只要您具有文件系统权限)。

答案 1 :(得分:58)

使用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起可用)