2012-02-01 65 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

相關問題