Khóa tệp trên NFS?


18

Máy chủ của tôi sử dụng NFS (Hệ thống tệp mạng) và tôi không thể sử dụng chức năng flock () của PHP. Có cách nào để khóa các tệp trên NFS không hoặc có cần phải làm như vậy không?

Câu trả lời:


11

Trang hướng dẫn flock(2)đã hết hạn trong một thời gian dài, nhưng kể từ đó đã được cập nhật để nói (nhấn mạnh của tôi):

Kể từ Linux 2.6.12, các máy khách NFS hỗ trợ các khóa flock () bằng cách mô phỏng chúng dưới dạng các khóa phạm vi byte trên toàn bộ tệp. Điều này có nghĩa là các khóa fcntl (2) và flock () tương tác với nhau qua NFS. Kể từ Linux 2.6.37, kernel hỗ trợ chế độ tương thích cho phép khóa flock () (và cả khóa vùng byte fcntl (2)) được coi là cục bộ; xem phần thảo luận về tùy chọn local_lock trong nfs (5).

Đó là từ trang web chính thức của trang man, http://man7.org/linux/man-pages/man2/flock.2.html hiển thị phiên bản mới từ trang man 4,00

Linux 2.6.12 được phát hành năm 2005.

Điều này ban đầu có nghĩa là một nhận xét về câu trả lời của janneb, nhưng tôi không có tiếng tăm vào thời điểm đó. Bản cập nhật doc đã xảy ra vào năm 2014: http://git.kernel.org/cgit/docs/man-pages/man-pages.git/commit/man2/flock.2?id=e449654fdb3f19aafc569df47d12bffdf6276236


11

Tôi không biết flock()chức năng PHP được triển khai như thế nào , nhưng giả sử đó là một giao diện cho tòa nhà flock(), thì nó không hoạt động ở tất cả các NFS. Từ flock()trang hướng dẫn:

flock (2) không khóa các tập tin qua NFS. Thay vào đó, hãy sử dụng fcntl (2): hoạt động trên NFS, được cung cấp một phiên bản Linux gần đây và một máy chủ hỗ trợ khóa.

Và, tất nhiên, tất cả những gì một trang đàn ông nói, dù lỗi thời đến đâu, là sự thật tối thượng.


+1, mỉa mai! Mục D10 trong phần xây dựng Câu hỏi thường gặp của NFS .
themel

8

flock()chỉ hoạt động tốt trên Linux NFS, bao gồm từ PHP. Chúng tôi sử dụng nó rộng rãi và đã kiểm tra kỹ lưỡng để xác minh rằng nó hoạt động như mong muốn. Kiểm tra xem bạn có đang chạy tất cả các dịch vụ cần thiết trên cả máy khách và máy chủ không. Tìm "portmapper" và "rpc.statd". Nếu chúng không chạy, bạn cần tìm ra tập lệnh init nào khởi động chúng trên bản phân phối của bạn. Trên các bản phân phối dựa trên Debian, nó " /etc/init.d/portmap" và " /etc/init.d/nfs-common".

Từ máy khách, chạy " rpcinfo -u $NFSSERVER status" và xem nếu bạn nhận được phản hồi. Khi cài đặt, tôi nhận được "chương trình 100024 phiên bản 1 đã sẵn sàng và đang chờ".

Ồ, cũng nên nhớ rằng trong một số trường hợp, NFS và statd có thể khó chịu nếu cả máy khách và máy chủ không có các mục nhập tên máy chủ đáng tin cậy cho nhau. Kiểm tra hai lần /etc/hoststrên cả hai máy.


1
Tôi không thực sự ở một vị trí để thay đổi chi tiết cụ thể của máy chủ. Chức năng flock () thậm chí bị vô hiệu hóa từ php.ini, vì nó sẽ không hoạt động, ít nhất đó là những gì tôi đã nói với.
rFactor

3

Chỉ muốn tự trả lời. Giải pháp có thể được tìm thấy ở đây: http://us3.php.net/manual/en/feft.flock.php#82521


3
Tùy chọn thứ hai được liệt kê chính xác như những gì tôi mô tả: sử dụng máy chủ khóa tích hợp trong Linux NFS. Các bước khắc phục sự cố được thiết kế để xác định lý do tại sao (dường như) không hoạt động ...
Insyte
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.