ล็อคไฟล์ใน NFS หรือไม่


18

เซิร์ฟเวอร์ของฉันใช้ NFS (ระบบไฟล์เครือข่าย) และฉันไม่สามารถใช้ฟังก์ชั่น flock () ของ PHP ได้ มีวิธีล็อกไฟล์ใน NFS หรือไม่หรือจำเป็นต้องทำเช่นนั้น?

คำตอบ:


11

หน้าคู่มือflock(2)ล้าสมัยมาเป็นเวลานาน แต่ได้รับการปรับปรุงให้พูด (ให้ความสำคัญ):

ตั้งแต่ Linux 2.6.12ไคลเอนต์ NFS สนับสนุนการล็อก flock () โดยจำลองพวกมันเป็นการล็อกแบบไบต์ในไฟล์ทั้งหมด ซึ่งหมายความว่าการล็อค fcntl (2) และ flock () จะทำงานร่วมกันผ่าน NFS ตั้งแต่ Linux 2.6.37 เคอร์เนลสนับสนุนโหมดความเข้ากันได้ที่อนุญาตให้ flock () ล็อค (และยังล็อค fcntl (2) ไบต์ภูมิภาค) จะถือว่าเป็นท้องถิ่น ดูการอภิปรายของตัวเลือก local_lock ใน nfs (5)

มาจากเว็บไซต์อย่างเป็นทางการของ man-pages http://man7.org/linux/man-pages/man2/flock.2.htmlซึ่งแสดงเวอร์ชั่นใหม่จาก man-pages 4.00

Linux 2.6.12 เปิดตัวในปี 2005

แต่เดิมนี้ตั้งใจจะแสดงความคิดเห็นต่อคำตอบของ janneb แต่ฉันไม่มีชื่อเสียงในเวลานั้น การอัปเดตเอกสารเกิดขึ้นในปี 2014: http://git.kernel.org/cgit/docs/man-pages/man-pages.git/commit/man2/flock.2?id=e449654fdb3f19aafc569df47d12bffdf6276236


11

ฉันไม่ทราบว่าflock()มีการใช้งานฟังก์ชันPHP อย่างไร แต่สมมติว่าเป็นส่วนต่อประสานกับflock()syscall ดังนั้นจึงไม่สามารถใช้งานได้กับ NFS จากflock()manpage:

flock (2) ไม่ล็อคไฟล์ผ่าน NFS ใช้ fcntl (2) แทน: ที่ทำงานผ่าน NFS ได้รับ Linux และเซิร์ฟเวอร์ที่รองรับการล็อกเวอร์ชันล่าสุด

และแน่นอนทุกอย่างที่หน้าคนพูดไม่ว่าล้าสมัยเป็นความจริงขั้นสูงสุด


+1, ถากถาง! รายการ D10 ในคำถามที่พบบ่อยของ NFS จะอธิบายรายละเอียด
themel

8

flock()ทำงานได้ดีบน Linux NFS รวมถึงจาก PHP เราใช้มันอย่างกว้างขวางและได้ทำการทดสอบอย่างละเอียดเพื่อตรวจสอบว่ามันทำงานได้ตามที่ต้องการ ตรวจสอบเพื่อดูว่าคุณใช้บริการที่จำเป็นทั้งหมดทั้งบนไคลเอนต์และเซิร์ฟเวอร์หรือไม่ ค้นหา "portmapper" และ "rpc.statd" หากพวกเขาไม่ได้ทำงานคุณต้องคิดออกว่าสคริปต์เริ่มต้นพวกเขาใน distro ของคุณ สำหรับ Distros ที่ใช้ Debian คือ " /etc/init.d/portmap" และ " /etc/init.d/nfs-common"

จากไคลเอ็นต์ให้รัน " rpcinfo -u $NFSSERVER status" และดูว่าคุณได้รับการตอบกลับหรือไม่ ในการตั้งค่าของฉันฉันได้รับ "โปรแกรม 1,00024 เวอร์ชัน 1 พร้อมและรอ" เป็นผลลัพธ์

โอ้โปรดจำไว้ด้วยว่าในบางสถานการณ์ NFS และ statd อาจไม่พอใจหากทั้งไคลเอนต์และเซิร์ฟเวอร์ไม่มีชื่อโฮสต์ที่เชื่อถือได้สำหรับกันและกัน ตรวจสอบอีกครั้ง/etc/hostsบนเครื่องทั้งสอง


1
ฉันไม่ได้อยู่ในฐานะที่จะเปลี่ยนแปลงรายละเอียดเฉพาะของเซิร์ฟเวอร์ ฝูง () - ฟังก์ชั่นปิดการใช้งานแม้กระทั่งจาก php.ini เพราะมันจะไม่ทำงานอย่างน้อยนั่นคือสิ่งที่ฉันได้รับการบอกให้
rFactor

3

แค่อยากตอบตัวเอง วิธีแก้ไขปัญหาสามารถพบได้ที่นี่: http://us3.php.net/manual/en/function.flock.php#82521


3
ตัวเลือกที่สองที่ระบุไว้เป็นสิ่งที่ฉันอธิบาย: การใช้เซิร์ฟเวอร์ล็อคในตัวใน Linux NFS ขั้นตอนการแก้ไขปัญหาที่ถูกออกแบบมาเพื่อตรวจสอบว่าทำไมมัน (เห็นได้ชัด) ไม่ได้ทำงาน ...
Insyte
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.