2012-02-01 67 views
35

我试图创建一个功能(用于记录的目的)以原子追加一行到文件,并创建它,如果它不存在

append($path, $data) 

  1. 创建$文件如果它不存在并且
  2. 以原子方式将$数据附加到它。

它具有

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

迄今为止最好的尝试是:

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

它的工作原理确定,但它似乎是一个相当复杂的。有没有更清洁(内置)的方法来做到这一点?

回答

75

PHP已经有一个内置的功能来做到这一点,file_put_contents()。语法是:

file_put_contents($filename, $data, FILE_APPEND); 

注意file_put_contents()将创建文件,如果它不存在(只要你有文件系统权限这么做)。

+0

请问downvote的用途是什么? – FtDRbwLXw6 2012-03-25 15:01:06

+3

我相信这不会使用模式'x'打开一个文件(C-land中的O_EXCL),所以如果文件不存在,你可以有竞争条件。见https://github.com/php/php-src/blob/master/ext/standard/file.c(看起来它只是用'c') – 2013-05-06 21:37:54

+9

30 ups,而不是最好的答案。贫穷的世界! ':(' – 2013-12-28 15:02:49

相关问题