2011-01-13 29 views
6

Nếu tôi ghi dữ liệu vào một tệp qua file_put_contents với bộ cờ FILE_APPEND và hai người dùng gửi dữ liệu cùng một lúc, nó sẽ nối thêm bất kể hoặc có một cơ hội một mục sẽ bị ghi đè không?Hai người dùng ghi vào một tệp cùng một lúc? (PHP/file_put_contents)

Nếu tôi đặt cờ LOCK_EX, lần gửi thứ hai sẽ chờ cho lần gửi đầu tiên hoàn thành hay dữ liệu bị mất khi không thể lấy khóa độc quyền?

PHP thường xử lý như thế nào? Tôi đang chạy phiên bản 5.2.9. nếu điều đó quan trọng.

Cảm ơn, Ryan

Trả lời

2

bạn cũng có thể kiểm tra flock chức năng để thực hiện khóa thích hợp (không dựa trên thời gian/ngủ lừa)

+0

Không phải điều này có hiệu lực mà công cụ sửa đổi LOCK_EX đang thực hiện ? –

+0

Như hướng dẫn nói: "Theo mặc định, chức năng này sẽ chặn cho đến khi khóa yêu cầu được mua lại, điều này có thể được kiểm soát (trên nền tảng không phải Windows) với tùy chọn LOCK_NB được ghi dưới đây". Vì vậy, nếu LOCK_EX trả về ngay lập tức với một lỗi, nó không phải là hành vi tương tự – Ass3mbler

+0

Cool - âm thanh như thế này là chính xác những gì OP là sau. +1 từ tôi. :-) –

1

Nếu bạn đặt một khóa tập tin độc quyền qua LOCK_EX, kịch bản thứ hai (thời gian-khôn ngoan) mà cố gắng để viết sẽ chỉ đơn giản là trả về false từ file_put_contents.

tức là: Nó sẽ không ngồi và chờ cho đến khi tệp có sẵn để viết.

Như vậy, nếu có nhu cầu bạn sẽ cần đến chương trình trong hành vi này chính mình, có lẽ bằng cách cố gắng sử dụng file_put_contents một hạn chế số lần (ví dụ .: 3) với việc sử dụng có kích thước phù hợp của sleep giữa mỗi lần thử.

+1

Bạn sẽ cần phải chạy một 'while' và một' sleep' sau một 'file_exists' kiểm tra để có thể chờ mở khóa – RobertPitt

+0

Còn câu hỏi # 1 ... nếu tôi không sử dụng khóa, điều gì sẽ xảy ra? – NightHawk

+0

@RobertPitt - Đã cập nhật câu trả lời của tôi theo những dòng này. Cuộc gọi tốt trên kiểm tra file_exists phía trước. :-) –

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