2012-03-25 25 views
7

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?

Trả lời

-1

Tôi sẽ kiểm tra xem liệu tôi có thể lấy khóa trên tập tin không, như này:

if (!flock($file, LOCK_EX)) { 
    throw new Exception(sprintf('Unable to obtain lock on file: %s', $file)); 
} 

fwrite($file, $write_contents); 
+1

Đ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ó. –

+0

@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ệ. –

+0

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ả. –

-1

Cuộc gọi bầy của bạn là kiểm tra xem nó đã bị khóa chưa. Nếu nó bị khóa, câu lệnh if() đó sẽ thất bại, vì vậy bạn có thể chỉ cần ném một người khác vào nó bằng một cái gì đó như:

if (flock($file, LOCK_EX)) {//lock was successful 
    fwrite($file,$write_contents); 
} else { 
    echo "$file is locked."; 
} 
+0

AHHH, vì vậy nó trả về false nếu tệp đã bị khóa? –

+1

Điều này không chính xác; xem bình luận của tôi về câu trả lời khá giống hệt của Mike Purcell. –

14

Như đã trình bày trong docs, sử dụng LOCK_NB để thực hiện một nỗ lực non-blocking để nhận được khóa, và trên thất bại kiểm tra đối số $wouldblock để xem cái gì khác giữ khóa.

if (!flock($fp, LOCK_EX|LOCK_NB, $wouldblock)) { 
    if ($wouldblock) { 
     // something already has a lock 
    } 
    else { 
     // couldn't lock for some other reason 
    } 
} 
else { 
    // lock obtained 
} 
Các vấn đề liên quan