Senario:
Bạn có một tệp có một chuỗi (giá trị câu trung bình) trên mỗi dòng. Đối với các đối số, hãy cho biết tệp này có kích thước 1Mb (hàng nghìn dòng).
Bạn có một tập lệnh đọc tệp, thay đổi một số chuỗi trong tài liệu (không chỉ nối thêm mà còn xóa và sửa đổi một số dòng) và sau đó ghi đè tất cả dữ liệu bằng dữ liệu mới.
Các câu hỏi:
Liệu 'máy chủ' PHP, HĐH hoặc httpd, v.v. đã có sẵn các hệ thống để ngăn chặn các vấn đề như thế này (đọc / viết nửa chừng khi viết) chưa?
Nếu có, vui lòng giải thích cách thức hoạt động và đưa ra ví dụ hoặc liên kết đến tài liệu liên quan.
Nếu không, có những thứ tôi có thể kích hoạt hoặc thiết lập, chẳng hạn như khóa một tệp cho đến khi hoàn thành ghi và làm cho tất cả các lần đọc và / hoặc ghi khác bị lỗi cho đến khi tập lệnh trước viết xong?
Giả định của tôi và thông tin khác:
Máy chủ được đề cập đang chạy PHP và Apache hoặc Lighttpd.
Nếu tập lệnh được gọi bởi một người dùng và đang viết nửa chừng cho tệp và một người dùng khác sẽ đọc tệp vào đúng thời điểm đó. Người dùng đọc nó sẽ không nhận được tài liệu đầy đủ, vì nó chưa được viết. (Nếu giả định này là sai xin vui lòng sửa cho tôi)
Tôi chỉ quan tâm đến việc viết và đọc PHP vào một tệp văn bản, và đặc biệt, các hàm "fopen" / "fwrite" và chủ yếu là "file_put_contents". Tôi đã xem tài liệu "file_put_contents" nhưng không tìm thấy mức độ chi tiết hoặc giải thích tốt về cờ "LOCK_EX" là gì hoặc làm gì.
Kịch bản là một ví dụ về trường hợp xấu nhất mà tôi cho rằng những vấn đề này có nhiều khả năng xảy ra, do kích thước lớn của tệp và cách chỉnh sửa dữ liệu. Tôi muốn tìm hiểu thêm về các vấn đề này và không muốn hoặc không cần câu trả lời hoặc nhận xét như "sử dụng mysql" hoặc "tại sao bạn lại làm như vậy" bởi vì tôi không làm điều đó, tôi chỉ muốn tìm hiểu về đọc / ghi tệp với PHP và dường như không tìm kiếm đúng chỗ / tài liệu và vâng tôi hiểu PHP không phải là ngôn ngữ hoàn hảo để làm việc với các tệp theo cách này.
file_put_contents()
chỉ là một trình bao bọc cho fopen()/fwrite()
điệu nhảy, LOCKEX
thực hiện giống như khi bạn gọi flock($handle, LOCKEX)
.