2010-01-14 31 views
7

Sử dụng:đồng thời truy cập file

fopen 
fwrite 
fclose 

gì xảy ra nếu hai người dùng cố gắng để mở cùng một tập tin cùng một lúc?

+4

Tôi không chắc chắn câu trả lời chính xác. Nhưng có, ai đó đã thử điều này. –

+0

Cũng phụ thuộc vào hệ điều hành. –

+1

Điều này là khá nhiều toàn bộ lý do MySQL 3.x trở nên phổ biến trong những ngày đầu phát triển web. –

Trả lời

6

Hoạt động tệp quy mô nhỏ quá nhanh đến mức hai lần ghi cùng lúc là khá hiếm. Bất kể, bạn có thể sử dụng flock để khóa các tập tin:

$fp = fopen('file.log', 'a+'); 
flock($fp, LOCK_EX); 
fwrite($fp, 'my data'); 
flock($fp, LOCK_UN); 
fclose($fp); 

Note fclose tự động mở khóa các tập tin, nhưng tôi thấy nó làm cho mã nhiều hơn một chút sử dụng để đưa những điều này trong

+0

+1, súc tích ... không giống như bánh của tôi! –

+0

nếu thông dịch viên khóa tệp nhưng sau đó trước khi nó được mở khóa, máy chủ sẽ chết vì vậy nó sẽ không được mở khóa? :) – ajsie

+0

@noname - Yup. Hệ thống khóa thường phải phân xử, đạt được sự nhất trí và đối phó với những điều này. –

1

Có, bạn có thể mở hai tệp cùng lúc trừ khi bạn khóa tệp [đàn]. Tuy nhiên, thời gian tốt nhất để đổ một tập tin sẽ là khi bạn đang viết cho nó, hoặc nếu bạn chọn để chỉ cho phép một người dùng xem một tập tin tại bất kỳ một điểm nào.

3

Điều quan trọng là:

  1. gì sẽ xảy ra khi họ viết
  2. gì sẽ xảy ra nếu (a) đọc, (b) lần đọc sau đó (b) viết sau đó (a) viết? Là (a) 's viết không hợp lệ vì nó tính toán không còn bắt nguồn từ trạng thái mới nhất?

Ví dụ cổ điển là ví dụ Cash machine/bank balance được sử dụng trong nhiều văn bản.

Bất kỳ loại chia sẻ ghi trạng thái đòi hỏi một số hình thức kiểm soát truy cập đồng thời như một mutex, nhưng có tấn của các vấn đề tiềm năng như race conditions, nạn đói và các biến thể trên dining philosophers problem.

Tuy nhiên, nhiều hệ điều hành cho phép File locking một số mô tả, có nghĩa là quy trình khác chờ khóa được giải phóng. Xem PHP's flock() for locking a file.

Bạn cũng có thể sử dụng phương pháp "thanh toán, thay đổi, cam kết/hợp nhất".

Tùy thuộc vào nguyên nhân của bạn, bạn có thể muốn xem xét một cơ sở dữ liệu như MySQL hoặc SQLite vì chúng sẽ cung cấp nhanh hơn, mạnh mẽ hơn cách để chia sẻ trạng thái được đọc nặng hoặc bộ nhớ cache-ít.

Rất nhiều vấn đề, cạm bẫy và cách chia sẻ trạng thái là rất lớn. Xin lỗi cho tất cả việc sử dụng Wikipedia.

1

Luôn luôn xảy ra. Tuy nhiên, câu trả lời cho câu hỏi của bạn phụ thuộc vào chính xác cả hai muốn/muốn làm gì với tệp đã mở. Các hành động/giải pháp có thể sẽ hoàn toàn phụ thuộc vào yêu cầu này.

3

. Sử dụng file_put_contents() thay vì cờ FILE_APPEND hoặc LOCK_EX.

Bất kỳ cờ nào trong số này đều khóa tệp để ghi.

Các vấn đề liên quan