GORAGOD.com

ปัญหา PHP ไม่ยอมอ่านค่าใหม่เมื่อมีการแก้ไขไฟล์ ตอนที่ 1

วิธีการแก้ปัญหาเมื่อมีการเรียกใช้งานเกี่ยวกับไฟล์แล้วข้อมูลเกี่ยวกับไฟล์ไม่เปลี่ยนแปลง หลังจากมีการเขียนไฟล์ทับ

เมื่อมีการเรียกใช้งานฟังก์ชั่นเกี่ยวกับไฟล์เหล่านี้ stat(), lstat(), file_exists(), is_writable(), is_readable(), is_executable(), is_file(), is_dir(), is_link(), filectime(), fileatime(), filemtime(), fileinode(), filegroup(), fileowner(), filesize(), filetype(), fileperms() PHP จะทำการแคชผลของการทำงานโดยอัตโนมัติ เพื่อให้การเรียกใช้งานคำสั่งต่างๆข้างต้นอีกครั้งสามารถทำได้รวดเร็วขึ้น

ยกตัวอย่างเช่น เมื่อมีการเรียกใช้งาน filesize() ในครั้งแรกและมีการเขียนไฟล์ใหม่ในทันที จากนั้นอ่าน filesize() กลับออกมาอีกครั้งจะได้ขนาดไฟล์เดิมก่อนการเขียน เนื่องจาก PHP ทำการแคชขนาดของไฟล์เก็บไว้
วิธีแก้ปัญหา คือเราต้องทำการเคลียร์แคชของ PHP ก่อนที่จะอ่านซ้ำ ด้วยฟังก์ชั่นนี้
clearstatcache(bool $clear_realpath_cache = false, string $filename = ""): void

ตัวอย่าง
<?php
// อ่านขนาดของไฟล์ 0 byte (ไฟล์ test.txt เป็นไฟล์เปล่าๆ)
echo filesize('test.txt');

// เขียนไฟล์ (8 byte)
file_put_contents('test.txt', 'test.txt');

// อ่านขนาดของไฟล์ซ้ำอีกครั้งยังคงได้ 0 byte ถึงแม้ไฟล์จะถูกเขียนใหม่ไปแล้ว
echo filesize('test.txt');

// เคลียร์แคช
clearstatcache();

// อ่านขนาดของไฟล์หลังจากเคลียร์แคชแล้ว ได้ 8 byte
echo filesize('test.txt');
?>

หมายเหตุ เมื่อมีการใช้คำสั่งลบไฟล์ด้วย unlink() แคชจะถูกล้างโดยอัตโนมัติอยู่แล้ว