Tôi có một tệp tôi đang viết, nhưng trước tiên tôi cần phải khóa nó (sử dụng flock()
), để ngăn chặn bất kỳ tập lệnh nào khác ghi vào đó. Vì vậy, tôi có:Kiểm tra xem tệp đã bị khóa bằng cách sử dụng đàn() không?
$file=fopen($file_p);
if (flock($file, LOCK_EX)) {//lock was successful
fwrite($file,$write_contents);
}
Nhưng tôi cần kiểm tra xem nó đã bị khóa chưa, để ngăn các tập lệnh khác ghi vào đó.
Tôi làm cách nào để thực hiện việc này?
Điều này không đúng. Nếu bạn không chỉ định bitmap 'LOCK_NB' trên thao tác được truyền cho đàn, thì * theo mặc định, chức năng này sẽ chặn cho tới khi khóa được yêu cầu * ([source] (http://www.php.net//) manual/en/function.flock.php)). Với mã ví dụ bạn đã đưa ra, 'flock' sẽ * không * trả về false để cho biết một khóa đã được đưa ra trên tệp bởi một quy trình khác, nhưng sẽ chỉ đợi cho đến khi quá trình đó giải phóng khóa của nó. –
@MarkAmery: Không chính xác như thế nào? Logic là đơn giản, nếu bạn không thể có được một 'khóa độc quyền' trên tập tin, sau đó ném ngoại lệ. Đó là vào mã gọi để tìm ra cách xử lý ngoại lệ. –
Không - trong trường hợp lý do không thể lấy khóa là một quy trình khác giữ nó, nhận xét của bạn ở trên không khớp với cách mã của bạn hoạt động. Thay vào đó, hành vi mà mã của bạn có là "Nếu bạn không thể lấy khóa độc quyền trên tệp, hãy tiếp tục chờ cho đến khi có thể, sau đó tiếp tục." - đây là hành vi mặc định của 'flock'. Bạn cần sử dụng công cụ sửa đổi 'LOCK_NB', như được hiển thị trong câu trả lời của Ryan Y, để làm cho mã của bạn hoạt động theo cách mà nhận xét của bạn mô tả. –