2012-01-19 23 views
8

Tôi đang sử dụng:Làm cách nào để sử dụng file_put_contents() với FILE_APPEND | LOCK_EX an toàn?

file_put_contents("peopleList.txt", $person, FILE_APPEND | LOCK_EX); 

ghi vào cuối của một tập tin và để đảm bảo không ai khác (hoặc script) cũng được ghi vào cùng một tập tin cùng một lúc.

PHP manual cho biết sẽ trả về giá trị giả nếu không thành công.

Nếu nó không thể có được một khóa trên tập tin, nó sẽ thất bại hoặc tiếp tục cố gắng cho đến khi nó có thể? Nếu nó không thành công khi không khóa được, thì cách tốt nhất để đảm bảo dữ liệu được viết là gì?

Có lẽ lặp lại hàm trong một vòng lặp while cho đến khi nó không trả về false (cringe) hoặc đơn giản là cung cấp cho người dùng (người truy cập trang web) một số loại GUI yêu cầu họ thử lại?

+1

Apache sinh ra một chuỗi trong đó tiến trình PHP được thực hiện. Nhiều người dùng = nhiều tiến trình PHP. Quá trình lấy khóa là người duy nhất được phép làm việc với tệp. Tất cả các quá trình khác sẽ nhận được một lỗi từ hàm file_put_contents và file_put_contents do những người dùng đó sẽ không viết bất cứ thứ gì vào tệp. Điều đó có nghĩa là trong khi 1 người dùng đang viết, những người khác đang bị từ chối và hàm sẽ trả về boolean 'false'. – Mjh

+0

Lý do tại sao LOCK_EX tồn tại là một chủ đề khác. Nếu bạn muốn ghi vào tệp bất kể, chỉ cần xóa LOCK_EX vì bạn không cần nó và người cuối cùng truy cập vào trang web/tập lệnh của bạn sẽ là người sẽ có dữ liệu được ghi vào tệp. Ngoài ra, kể từ khi bạn đang làm phụ thêm - điểm của khóa tập tin ở tất cả là gì? Chỉ cần loại bỏ nó. – Mjh

+0

Tôi đang sử dụng LOCK_EX và FILE_APPEND cùng nhau bởi vì các tập lệnh khác có khả năng ghi vào tệp và tôi không làm những gì chúng có thể trong khi dữ liệu đang được thêm vào và ngược lại. – hozza

Trả lời

2

Thực ra, câu trả lời trước của tôi hơi lỗi thời. flock() khối cho đến khi requested lock is acquired:

PHP hỗ trợ một cách di động của khóa tập tin hoàn tất một cách tư vấn (có nghĩa là tất cả các chương trình truy cập phải sử dụng cùng một cách của khóa hoặc nó sẽ không làm việc). Theo mặc định, chức năng này sẽ chặn cho đến khi yêu cầu khóa đượ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, kể từ khi file_get_contents() sử dụng nó, tôi cho rằng nó giống nhau. Điều đó nói rằng, được cảnh báo rằng nó thay đổi theo hệ điều hành.

Quan trọng hơn một chút, bạn không cần khóa tệp trong trường hợp bạn mô tả, vì lý do N.B. đã được giải thích. Trừ khi bạn đang sử dụng CLI SAPI, tôi không thể nghĩ ra một kịch bản chung, bạn nên lo lắng về việc khóa tập tin.

+0

@hozza xin vui lòng, không cần phải đoán những gì tôi đang nghĩ, tôi chỉ giải thích mọi thứ. Nếu bạn không hiểu chúng, đó là một điều khác. Sử dụng một vòng lặp kết hợp với giấc ngủ chỉ đơn giản là đặt - ngu ngốc. Bạn đang làm FILE_APPEND, không cần sử dụng LOCK_EX chút nào. Không sao chép các ví dụ từ php.net một cách mù quáng, nó cho bạn biết những gì và những gì nó được sử dụng cho. – Mjh

+0

Mã tôi đã cung cấp là một ví dụ. Kịch bản chỉ đơn giản là nhiều kịch bản có thể nối thêm, cắt ngắn hoặc đọc tệp. Tôi chỉ muốn một trong những điều này xảy ra cùng một lúc, do đó muốn khóa tệp bằng LOCK_EX khi sử dụng file_put_contents(); – hozza

+0

Sau đó, những gì @NB nói. Thử chạy các tập lệnh đồng thời và xem điều gì xảy ra – yannis

0

Nếu chức năng không lấy được khóa cho tệp thì nó sẽ trả lại lỗi bạn có thể sử dụng.

if ($result === false) { print "failed to lock"; } 

Bây giờ nếu bạn muốn thử khóa một vài lần chỉ cần sử dụng vòng lặp để tiếp tục ghi vào tệp.

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