我試圖創建一個功能(用於記錄的目的)以原子追加一行到文件,並創建它,如果它不存在
append($path, $data)
是
- 創建$文件如果它不存在並且
- 以原子方式將$數據附加到它。
它具有
- 支持高併發,
- 支持長字符串和
- 儘可能高性能。
迄今爲止最好的嘗試是:
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);
}
它的工作原理確定,但它似乎是一個相當複雜的。有沒有更清潔(內置)的方法來做到這一點?
請問downvote的用途是什麼? – FtDRbwLXw6 2012-03-25 15:01:06
我相信這不會使用模式'x'打開一個文件(C-land中的O_EXCL),所以如果文件不存在,你可以有競爭條件。見https://github.com/php/php-src/blob/master/ext/standard/file.c(看起來它只是用'c') – 2013-05-06 21:37:54
30 ups,而不是最好的答案。貧窮的世界! ':(' – 2013-12-28 15:02:49