PHP: Lock File ไม่ให้คนอื่นมาอ่านหรือเขียน

การ 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 ได้ครับ