Định Nghĩa.
Hàm flock()
có chức năng để khóa và giải phóng một tệp.
Cú pháp.
Cú pháp:
flock ( resource$handle
, int$operation
[, int&$wouldblock
] ) : bool
Trong đó.
- $handle Tài nguyên con trỏ resource tệp thường được tạo bằng fopen().
- $operation – LOCK_SH để có được một khóa chia sẻ (người đọc). – LOCK_EX để có được một khóa độc quyền (Cho người tạo file). – LOCK_UN để phát hành khóa (chia sẻ hoặc độc quyền). – Cũng có thể thêm LOCK_NB dưới dạng bitmask vào một trong các thao tác trên nếu bạn không muốn bầy () bị chặn trong khi khóa.
- $wouldblock đối số thứ ba tùy chọn được đặt thành 1 nếu khóa sẽ chặn (điều kiện lỗi EWOULDBLOCK).
Giá trị trả về.
- Trả về TRUE khi thành công hoặc FALSE khi thất bại.
Sự thay đổi.
- PHP 5.5.22, 5.6.6 Đã thêm hỗ trợ cho tham số willblock trên Windows.
- PHP 5.3.2 chức năng mở khóa tự động khi xử lý tài nguyên của tệp bị khóa đã bị loại bỏ.Hiện tại mở khóa đều phải mở kháo bằng tay.
Ví dụ.
ví dụ 1 flock() đơn giản.
code:
<?php $fp = fopen("/tmp/lock.txt", "r+"); if (flock($fp, LOCK_EX)) { // có được một khóa độc quyền ftruncate($fp, 0); // cắt ngắn tập tin fwrite($fp, "Write something here\n"); fflush($fp); // tuôn ra đầu ra trước khi phát hành khóa flock($fp, LOCK_UN); // mở khóa } else { echo "Couldn't get the lock!"; } fclose($fp); ?>
Ví dụ số 2 sử dụng tùy chọn LOCK_NB
code.
<?php $fp = fopen('/tmp/lock.txt', 'r+'); /* Activate the LOCK_NB option on an LOCK_EX operation */ if(!flock($fp, LOCK_EX | LOCK_NB)) { echo 'Unable to obtain lock'; exit(-1); } /* ... */ fclose($fp); ?>
Ghi chú.
- Ghi chú: flock () sử dụng khóa bắt buộc thay vì khóa tư vấn trên Windows. Khóa bắt buộc cũng được hỗ trợ trên các hệ điều hành dựa trên Linux và System V thông qua cơ chế thông thường được hỗ trợ bởi lệnh gọi hệ thống fcntl (): nghĩa là, nếu tệp đang nghi vấn có tập quyền bit setgid và bit thực thi nhóm bị xóa. Trên Linux, hệ thống tệp cũng sẽ cần được gắn với tùy chọn bắt buộc để làm việc này.
- Ghi chú: Vì flock () yêu cầu con trỏ tệp, bạn có thể phải sử dụng tệp khóa đặc biệt để bảo vệ quyền truy cập vào tệp mà bạn định cắt ngắn bằng cách mở tệp ở chế độ ghi (với đối số “w” hoặc “w +” để fopen()). ).
- Ghi chú: Chỉ có thể được sử dụng trên các con trỏ tệp được trả về bởi fopen()). cho các tệp cục bộ hoặc các con trỏ tệp trỏ đến các luồng không gian người dùng thực hiện phương thức streamWrapper::stream_lock()
- Cảnh báo Gán một giá trị khác để xử lý đối số trong mã tiếp theo sẽ giải phóng khóa.
- Cảnh báo Trên một số hệ điều hành, flock() được thực hiện ở cấp quy trình. Khi sử dụng API máy chủ đa luồng như ISAPI, bạn không thể dựa vào flock () để bảo vệ các tệp chống lại các tập lệnh PHP khác chạy trong các luồng song song của cùng một máy chủ! flock () không được hỗ trợ trên các hệ thống tập tin lỗi thời như FAT và các dẫn xuất của nó và do đó sẽ luôn trả về FALSE trong các môi trường này.
Thông tin thêm.
- flock () cho phép bạn thực hiện một mô hình trình đọc / ghi đơn giản có thể được sử dụng trên hầu hết mọi nền tảng (bao gồm hầu hết các dẫn xuất Unix và thậm chí cả Windows).
- Trên các phiên bản PHP trước 5.3.2, khóa cũng được phát hành bởi fclose() (cũng được gọi tự động khi tập lệnh kết thúc).
- PHP hỗ trợ một cách di động để khóa các tệp hoàn chỉnh theo 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 khóa hoặc nó sẽ không hoạt động). Theo mặc định, chức năng này sẽ chặn cho đến khi có được khóa yêu cầu; điều này có thể được kiểm soát với tùy chọn LOCK_NB được ghi lại dưới đây.
- Một ý kiến của một lập trinh viên khác các bạn hãy tham khảo. – Các tài liệu được cung cấp là mơ hồ, mơ hồ và thiếu, và các bình luận của người dùng chứa thông tin sai lệch! Hàm flock tuân theo ngữ nghĩa của lệnh gọi hệ thống Unix có cùng tên. Flock chỉ sử dụng khóa ADVISORY ; nghĩa là, các quá trình khác có thể bỏ qua khóa hoàn toàn; nó chỉ ảnh hưởng đến những người gọi cuộc gọi bầy. – LOCK_SH có nghĩa là CHIA SẺ KHÓA. Bất kỳ số lượng quá trình có thể CÓ LOCK CHIA SẺ đồng thời. Nó thường được gọi là khóa đọc. – LOCK_EX có nghĩa là KHÓA ĐỘC QUYỀN. Mỗi lần chỉ có một quy trình duy nhất có thể sở hữu một khóa độc quyền cho một tệp nhất định. – Nếu tệp đã được KHÓA với LOCK_SH trong một quy trình khác, flock với LOCK_SH sẽ THÀNH CÔNG. flock với LOCK_EX sẽ BLOCK UNTIL TẤT CẢ CÁC KHÓA ĐỌC HIỂU ĐƯỢC LIÊN QUAN. – Nếu tệp đã bị khóa với LOCK_EX trong một quy trình khác, GỌI S BL BLOCK UNTIL TẤT CẢ CÁC KHÓA KHÁC đã được phát hành. – Tuy nhiên, nếu bạn gọi flock trên một tệp mà bạn sở hữu khóa, nó sẽ cố gắng thay đổi nó. Vì vậy: flock (LOCK_EX) theo sau là flock (LOCK_SH) sẽ giúp bạn khóa CHIA SẺ chứ không phải khóa “đọc-ghi”.
Các bạn có thể xem chi tiết hơn trên php.net.
Hi vọng với bài viết này, bạn đã hiểu rõ ứng dụng của hàm flock() trong PHP. Nếu bạn thấy bài viết hay và có ý nghĩa hãy like và chia sẻ bài viết này để mọi người cùng nhau học tập nhé. Cảm ơn các bạn đã ghé thăm codetutam.com