Tôi đang cố gắng để tạo ra một chức năng (cho mục đích khai thác gỗ)nguyên tử phụ thêm một dòng vào một tập tin và tạo ra nó nếu nó không tồn tại
append($path, $data)
rằng
- tạo $ file nếu nó không tồn tại và
- gắn thêm dữ liệu vào dữ liệu đó một cách nguyên tử.
Nó phải
- hỗ trợ đồng thời cao, chuỗi dài
- hỗ trợ và
- như performant càng tốt.
Cho đến nay các nỗ lực tốt nhất là:
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);
}
Nó hoạt động OK, nhưng nó có vẻ là một khá phức tạp. Có cách dọn dẹp (tích hợp sẵn hơn) không?
Tôi có thể hỏi ý kiến của bài viết này không? – FtDRbwLXw6
Tôi tin rằng điều này sẽ không sử dụng chế độ 'x' để mở tệp (O_EXCL trong C-land), vì vậy bạn có thể có điều kiện chủng tộc nếu tệp không tồn tại. Xem https://github.com/php/php-src/blob/master/ext/standard/file.c (có vẻ như nó chỉ sử dụng 'c') –
30 không phải là câu trả lời hay nhất. thế giới nghèo! ': (' –