การจัดการไฟล์: file_get_contents, file_put_contents
ในบทเรียนก่อนหน้า เราได้เรียนรู้วิธีการจัดการไฟล์ด้วยฟังก์ชันพื้นฐานอย่าง fopen(), fread(), fwrite() และ fclose() ซึ่งเป็นวิธีการที่ให้ความยืดหยุ่นในการควบคุมการอ่านและเขียนไฟล์อย่างละเอียด ในบทนี้ เราจะมาดูฟังก์ชันที่ใช้งานง่ายกว่าและเหมาะสำหรับงานที่ต้องการอ่านหรือเขียนไฟล์ทั้งหมดในครั้งเดียว นั่นคือ file_get_contents() และ file_put_contents()
การอ่านไฟล์ทั้งหมดด้วย file_get_contents()
ฟังก์ชัน file_get_contents() ทำหน้าที่อ่านเนื้อหาทั้งหมดของไฟล์และส่งกลับเป็น string ซึ่งทำให้ง่ายต่อการนำข้อมูลในไฟล์ไปใช้งานต่อ ตัวอย่างเช่น:
<?php
$filename = 'my_file.txt';
// ตรวจสอบว่าไฟล์มีอยู่จริงหรือไม่
if (file_exists($filename)) {
$content = file_get_contents($filename);
if ($content !== false) {
echo "<p>เนื้อหาของไฟล์: <pre>" . htmlspecialchars($content) . "</pre></p>";
} else {
echo "<p>ไม่สามารถอ่านไฟล์ได้</p>";
}
} else {
echo "<p>ไฟล์ $filename ไม่พบ</p>";
}
?>
ในตัวอย่างนี้:
- เรากำหนดชื่อไฟล์ที่จะอ่านในตัวแปร
$filename - เราใช้
file_exists()เพื่อตรวจสอบว่าไฟล์มีอยู่จริงก่อนที่จะพยายามอ่าน - เราเรียกใช้
file_get_contents()เพื่ออ่านเนื้อหาทั้งหมดของไฟล์ - เราตรวจสอบว่า
file_get_contents()คืนค่าfalseหรือไม่ ซึ่งบ่งบอกว่าเกิดข้อผิดพลาดในการอ่านไฟล์ - หากอ่านไฟล์สำเร็จ เราจะแสดงเนื้อหาของไฟล์ออกมา โดยใช้
htmlspecialchars()เพื่อป้องกันการแสดงผล HTML ที่ไม่พึงประสงค์ (เช่น script injection)
ข้อควรระวัง: file_get_contents() จะอ่านไฟล์ทั้งหมดลงในหน่วยความจำ ดังนั้นจึงไม่เหมาะสำหรับไฟล์ขนาดใหญ่มาก เพราะอาจทำให้หน่วยความจำของเซิร์ฟเวอร์หมดได้
การเขียนข้อมูลลงไฟล์ด้วย file_put_contents()
ฟังก์ชัน file_put_contents() ทำหน้าที่เขียนข้อมูลลงในไฟล์ หากไฟล์ไม่มีอยู่ จะสร้างไฟล์ใหม่ หากไฟล์มีอยู่แล้ว โดยค่าเริ่มต้น จะเขียนทับเนื้อหาเดิม แต่เราสามารถกำหนดให้เขียนต่อท้ายไฟล์ได้ด้วย
<?php
$filename = 'my_file.txt';
$data = "Hello, world!\nThis is a new line.";
// เขียนข้อมูลลงในไฟล์ (เขียนทับเนื้อหาเดิม)
$result = file_put_contents($filename, $data);
if ($result !== false) {
echo "<p>เขียนข้อมูลลงในไฟล์สำเร็จ (เขียนทับ). เขียนไป " . $result . " ไบต์</p>";
} else {
echo "<p>ไม่สามารถเขียนข้อมูลลงในไฟล์ได้</p>";
}
$more_data = "\nThis is another line appended to the file.";
// เขียนข้อมูลต่อท้ายไฟล์
$result = file_put_contents($filename, $more_data, FILE_APPEND);
if ($result !== false) {
echo "<p>เขียนข้อมูลต่อท้ายไฟล์สำเร็จ. เขียนไป " . $result . " ไบต์</p>";
} else {
echo "<p>ไม่สามารถเขียนข้อมูลต่อท้ายไฟล์ได้</p>";
}
?>
ในตัวอย่างนี้:
- เรากำหนดชื่อไฟล์ที่จะเขียนในตัวแปร
$filenameและข้อมูลที่จะเขียนในตัวแปร$data - เราเรียกใช้
file_put_contents()เพื่อเขียนข้อมูลลงในไฟล์ โดยค่าเริ่มต้น จะเขียนทับเนื้อหาเดิม - เราตรวจสอบว่า
file_put_contents()คืนค่าfalseหรือไม่ ซึ่งบ่งบอกว่าเกิดข้อผิดพลาดในการเขียนไฟล์ - หากเขียนไฟล์สำเร็จ เราจะแสดงข้อความบอกว่าเขียนไฟล์สำเร็จ และจำนวนไบต์ที่เขียนลงไป
- เราเขียนข้อมูลต่อท้ายไฟล์โดยใช้ flag
FILE_APPENDเป็น parameter ที่สามของfile_put_contents()
ข้อควรระวัง: เช่นเดียวกับ file_get_contents(), file_put_contents() ก็ไม่เหมาะสำหรับไฟล์ขนาดใหญ่มาก เพราะข้อมูลทั้งหมดจะถูกเก็บไว้ในหน่วยความจำก่อนที่จะเขียนลงไฟล์
ข้อดีและข้อเสียของการใช้ file_get_contents() และ file_put_contents()
ข้อดี:
- ใช้งานง่าย: ฟังก์ชันเหล่านี้ใช้งานง่ายกว่า
fopen(),fread(),fwrite()และfclose()มาก - Code สั้น: สามารถอ่านหรือเขียนไฟล์ทั้งหมดได้ด้วยโค้ดเพียงไม่กี่บรรทัด
- เหมาะสำหรับงานง่ายๆ: เหมาะสำหรับงานที่ต้องการอ่านหรือเขียนไฟล์ทั้งหมดในครั้งเดียว เช่น การอ่านไฟล์ config, การเขียน log ไฟล์ขนาดเล็ก
ข้อเสีย:
- ไม่เหมาะสำหรับไฟล์ขนาดใหญ่: อ่านหรือเขียนไฟล์ทั้งหมดลงในหน่วยความจำ ซึ่งอาจทำให้หน่วยความจำหมดได้หากไฟล์มีขนาดใหญ่มาก
- ควบคุมการทำงานได้น้อย: ไม่สามารถควบคุมการอ่านหรือเขียนไฟล์ได้ละเอียดเท่ากับ
fopen(),fread(),fwrite()และfclose() - ไม่มี error handling ที่ละเอียด: การจัดการ error ทำได้เพียงตรวจสอบว่าฟังก์ชันคืนค่า
falseหรือไม่ ซึ่งไม่เพียงพอสำหรับการจัดการ error ที่ซับซ้อน
กรณีใช้งานจริงและข้อผิดพลาดที่พบบ่อย
กรณีใช้งานจริง:
- การอ่านไฟล์ config: อ่านไฟล์ config ที่มีข้อมูลการตั้งค่าของโปรแกรม
- การเขียน log ไฟล์ขนาดเล็ก: เขียนข้อความ log ลงในไฟล์
- การอ่านไฟล์ HTML เพื่อแสดงผล: อ่านไฟล์ HTML และแสดงผลบนหน้าเว็บ
- การ cache ข้อมูล: บันทึกผลลัพธ์ของการคำนวณลงในไฟล์เพื่อนำกลับมาใช้ใหม่ในภายหลัง (cache)
ข้อผิดพลาดที่พบบ่อย:
- Permission denied: PHP ไม่มีสิทธิ์ในการอ่านหรือเขียนไฟล์
- File not found: ไฟล์ที่ต้องการอ่านหรือเขียนไม่มีอยู่จริง
- Memory exhausted: หน่วยความจำหมดเนื่องจากไฟล์มีขนาดใหญ่เกินไป
- Disk full: พื้นที่ดิสก์เต็ม ทำให้ไม่สามารถเขียนไฟล์ได้
- Encoding issue: ปัญหาเกี่ยวกับ encoding ของไฟล์ ทำให้ข้อมูลที่อ่านหรือเขียนไม่ถูกต้อง (เช่น ภาษาไทยแสดงผลผิดพลาด)
สรุป
file_get_contents() และ file_put_contents() เป็นฟังก์ชันที่มีประโยชน์สำหรับการจัดการไฟล์ใน PHP โดยเฉพาะอย่างยิ่งสำหรับงานที่ต้องการอ่านหรือเขียนไฟล์ทั้งหมดในครั้งเดียว อย่างไรก็ตาม ควรระมัดระวังในการใช้งานกับไฟล์ขนาดใหญ่ และควรตรวจสอบ permission และการมีอยู่ของไฟล์ก่อนที่จะใช้งานเสมอ ในบทเรียนถัดไป เราจะพูดถึงฟังก์ชันอื่นๆ ที่เกี่ยวข้องกับการจัดการไฟล์ เช่น is_file(), is_dir() และ file_exists()