2012-01-19 31 views
5

Tôi mới sử dụng PHP. Tôi hiểu rằng tôi có thể sử dụng flock() để khóa tệp và tránh điều kiện cuộc đua khi hai người dùng tiếp cận cùng một tệp php thêm nội dung vào tệp có thể khóa.Làm thế nào để tránh deadlocks tập tin khi quá trình PHP/máy chủ bị treo?

Tuy nhiên, điều gì xảy ra nếu quá trình php bị lỗi? Điều gì sẽ xảy ra với người dùng tiếp theo đang chờ tệp có thể khóa? Điều gì xảy ra nếu máy chủ bị treo (ai đó kéo phích cắm)? Khóa có tự động được giải phóng không? Tệp sẽ vẫn bị khóa sau khi khởi động lại máy chủ?

Để làm cho ngắn gọn, PHP có đảm bảo các tình huống quan trọng như vậy (tức là, khóa không được phát hành rõ ràng) được xử lý đúng cách không? Nếu không, làm thế nào nên đối phó với những tình huống này? Làm thế nào để phục hồi từ những?

Trả lời

5

Các khóa được xử lý bởi hệ điều hành. Do đó:

  • nếu một quá trình tai nạn, tất cả các ổ khóa nó tổ chức được giải phóng (cùng với bất kỳ loại khác của tài nguyên đó tổ chức)
  • nếu hệ thống bị treo, ổ khóa là vô nghĩa vì họ không "mang theo" để lần khởi động lại tiếp theo

PHP không cần phải làm bất cứ điều gì đặc biệt ngoài việc sử dụng cơ chế do OS cung cấp để khóa tệp, vì vậy nói chung bạn hoàn toàn an toàn.

Tuy nhiên, nếu thiết lập máy chủ web của bạn sao cho mỗi yêu cầu không được xử lý một cách bất thường (giả sử chuỗi bị hủy) khóa sẽ tiếp tục và chặn tất cả các yêu cầu khác khóa, nhanh chóng dẫn đến một máy chủ web bế tắc. Đó là một trong nhiều lý do khiến bạn thực sự không nên sử dụng các thiết lập không cung cấp sự cô lập mức độ quy trình trong số các yêu cầu (từ chối trách nhiệm: Tôi không phải là chuyên gia máy chủ web - tôi có thể sai trong phần "không nên", mặc dù tôi nghi ngờ nó).

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