เซิร์ฟเวอร์ของฉันใช้ NFS (ระบบไฟล์เครือข่าย) และฉันไม่สามารถใช้ฟังก์ชั่น flock () ของ PHP ได้ มีวิธีล็อกไฟล์ใน NFS หรือไม่หรือจำเป็นต้องทำเช่นนั้น?
เซิร์ฟเวอร์ของฉันใช้ NFS (ระบบไฟล์เครือข่าย) และฉันไม่สามารถใช้ฟังก์ชั่น flock () ของ PHP ได้ มีวิธีล็อกไฟล์ใน NFS หรือไม่หรือจำเป็นต้องทำเช่นนั้น?
คำตอบ:
หน้าคู่มือ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
ฉันไม่ทราบว่าflock()
มีการใช้งานฟังก์ชันPHP อย่างไร แต่สมมติว่าเป็นส่วนต่อประสานกับflock()
syscall ดังนั้นจึงไม่สามารถใช้งานได้กับ NFS จากflock()
manpage:
flock (2) ไม่ล็อคไฟล์ผ่าน NFS ใช้ fcntl (2) แทน: ที่ทำงานผ่าน NFS ได้รับ Linux และเซิร์ฟเวอร์ที่รองรับการล็อกเวอร์ชันล่าสุด
และแน่นอนทุกอย่างที่หน้าคนพูดไม่ว่าล้าสมัยเป็นความจริงขั้นสูงสุด
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
บนเครื่องทั้งสอง
แค่อยากตอบตัวเอง วิธีแก้ไขปัญหาสามารถพบได้ที่นี่: http://us3.php.net/manual/en/function.flock.php#82521