การ lock file ใน php ทำเพื่อป้องกันไม่ให้คนอื่นมาอ่านหรือเขียน ในขณะที่เรากำลังอ่านหรือเขียนอยู่ โดยเราจะใช้ function ที่ชื่อว่า flock ตัว flock จะเป็นตัวจัดการว่ามีคนอ่านหรือเขียน file นี้อยู่หรือไม่ ประโยชน์ของมันคือการเขียนทีละครั้งจะทำให้ข้อมูลไม่เกิดข้อผิดพลาดกรณีที่ write 2 ตัวพร้อมกันและข้อมูลไม่เหมือนกันครับ แต่โทษของมันคือการ deadlock คือหากเราลืม unlock หรือไปไม่ถึงขั้นนั้นจะทำให้คนอื่นๆเขียนไม่ได้เช่นกันครับ
รูปแบบ Function flock()
boolean flock(file_resource handler,int operation,int &wouldblock);
อธิบายง่ายๆคือ
- file_resurce คือตัวแปรที่มาจาก fopen อ่ะครับ
- operation จะเป็นค่าคงตัวซึ่งเค้ากำหนดมาดังนี้ครับ
LOCK_SH คือ ไม่ให้คนอื่นอ่าน
LOCK_EX คือ ไม่ให้คนอื่นเขียน
LOCK_UN คือปลดล็อค (แต่ถ้าใช้ lock ผมว่ามันกันได้ทั้งอ่านและเขียน)
LOCK_NB คือบอกว่าไม่อนุญาติให้คนอื่นใช้งานตอนล็อคอยู่ทันที(ถ้าไม่ใส่ตัวนี้ คนอื่นจะรอจนกว่าจะ unlock ถึงจะอ่านเขียนได้ แต่ถ้าใส่จะ return false ทันที - wouldblock ไม่ทราบครับ ผมไม่ใช้
return ค่าเป็น true หากล็อคได้ และ false ถเาล็อคไม่ได้
ตัวอย่างการใช้
<?php $fp = fopen("lock.txt", "w+"); if (flock($fp, LOCK_EX | LOCK_NB )) { ftruncate($fp, 0); // truncate file fwrite($fp, "Write heren aaa adsasd \n"); fflush($fp); // flush output before releasing the lock sleep(10); flock($fp, LOCK_UN | LOCK_NB ); // release the lock } else { echo "Couldn't get the lock!"; } fclose($fp); ?>
จาก code นี้ถ้าสั่งเรียก file นี้ 2 ครั้งติดๆกันจะเห็นว่าครั้งที่ 2 จะขึ้นว่าไม่สามารถ lock ได้ครับ