Input/output with files

30 January 2017

ในบทนี้ คุณจะได้เรียนรู้เกี่ยวกับการอ่านเขียนข้อมูลกับไฟล์ในภาษา PHP เราจะทำงานกับ Text files

ในการเขียนโปรแกรม เรามักจะทำงานกับไฟล์ซึ่งอาจจะเป็น Text file หรือ Binary file สำหรับในบทนี้เราจะพูดเกี่ยวกับการทำงานกับ Text file ด้วยฟังก์ชันมาตรฐานในภาษา PHP ซึ่งสามารถจัดการการอ่านและการเขียนข้อมูลกับไฟล์ได้ การใช้งานไฟล์ในภาษา PHP นั้นมักจะใช้กับการเก็บข้อมูลบนเซิร์ฟเวอร์ ยกตัวอย่างเช่น การเก็บ log ของ http request การเก็บ log ของข้อผิดพลาดที่เกิดขึ้นบนเซิร์ฟเวอร์ หรือไฟล์สำหรับการตั้งค่า เป็นต้น

การเปิดไฟล์เพื่ออ่านและเขียน

ในการทำงานกับไฟล์เพื่ออ่านและเขียนข้อมูลในภาษา PHP นั้น เราใช้ฟังก์ชัน fopen() นี่เป็นรูปแบบการทำงานของฟังก์ชัน

$handle = fopen($path, $mode);

นี่เป็นรูปแบบการใช้งานของฟังก์ชัน fopen() เพื่อเปิดไฟล์ ฟังก์ชันนี้มีสองพารามิเตอร์ คือ $path คือที่อยู่ของไฟล์ที่อาจจะเป็น local ไฟล์หรือเป็น URLs ใน protocol http และ $mode เป็นการกำหนดรูปแบบของการเปิดไฟล์ เช่น การเปิดไฟล์เพื่ออ่าน (r) การเปิดไฟล์เพื่อเขียน (w) หรือการเปิดไฟล์เพื่ออ่านหรือเขียนต่อท้าย (a+) เป็นต้น

<?php

$handle_reader = fopen("c:\\marcuscode\\http_request.txt", "r");
$handle_writer = fopen("c:\\marcuscode\\error_log.txt", "w");

?>

ในตัวอย่าง เป็นการใช้งานฟังก์ชัน fopen() เพื่อเปิดไฟล์สำหรับอ่านและเขียน โดยฟังก์ชันจะ return file handle กับมาเพื่อให้เราสามารถนำไปใช้ในการอ่านและเขียนต่อไป เราได้ทำการเปิดไฟล์ในตัวแปร $handle_reader เป็นการเปิดไฟล์เพื่ออ่านข้อมูล และ $handle_writer เป็นการเปิดไฟล์เพื่อเขียนข้อมูล

การอ่านข้อมูลจากไฟล์ในภาษา PHP

ต่อไปมาดูตัวอย่างการอ่านข้อมูลจาก Text file ในภาษา PHP โดยเราจะอ่านข้อมูลจากไฟล์ทีละบรรทัดด้วยฟังก์ชัน fgets() และแสดงผลข้อมูลที่ผ่านได้จากไฟล์บนหน้าจอ นี่เป็นโค้ดการอ่านไฟล์ในภาษา PHP

<?php

$handle = fopen("c:\\project\\http_status_code.txt", "r");

if ($handle) {

    while (!feof($handle)) {
        $line = fgets($handle);
        echo $line;
    }

    fclose($handle);
} else {
    echo "Error opening file.\n";   
}

?>

ในตัวอย่างเป็นการอ่านไฟล์จาก c:\project\http_status_code.txt ที่ใช้เป็นพารามิเตอร์แรกของฟังก์ชัน fopen() และโหมดของการเปิดไฟล์เป็น "r" ที่บ่งบอกว่าในการเปิดไฟล์ครั้งนี้สำหรับอ่านเท่านั้น หลังจากเปิดไฟล์สำเร็จโปรแกรมจะส่งค่ากลับเป็น file resource กลับมายังตัวแปร $handle เพื่อนำไปใช้สำหรับอ่านไฟล์ต่อไป และก่อนที่จะนำตัวแปรไปใช้งาน เราจำเป็นต้องตรวจสอบการเปิดไฟล์ว่าสำเร็จหรือไม่ด้วยคำสั่ง If

while (!feof($handle)) {
    $line = fgets($handle);
    echo $line;
}

เราใช้คำสั่ง while loop เพื่อวนอ่านข้อมูลในไฟล์ทีละบรรทัดด้วยฟังก์ชัน fgets() ซึ่งในแต่ละรอบข้อมูลจากไฟล์ที่อ่านจะได้จะถูกนำมาเก็บไว้ในตัวแปร $line ในเงือนไขของ while loop นั้นเราใช้ฟังก์ชัน feof() เพื่อตรวจสอบว่า file pointer ซึ่งเป็นตัวชี้ตำแหน่งปัจจุบันของการผ่านหรือเขียนไฟล์ นั้นได้ไปถึงจุดสิ้นสุดของไฟล์หรือยัง ถ้าสิ้นสุดหมายถึงโปรแกรมได้ทำการอ่านข้อมูลจากไฟล์ครบทุกบรรทัดแล้ว

fclose($handle);

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

200 OK
301 Moved Permanently
304 Not Modified
404 Not Found
500 Internal Server Error
502 Bad Gateway

นี่เป็นผลลัพธ์ในการทำงานของโปรแกรมของการอ่านไฟล์จาก Text file และนำมาแสดงผลที่หน้าจอ ซึ่งไฟล์ http_status_code.txt ในคอมพิวเตอร์ของเรานั้นมีข้อมูลดังรูปภาพข้างล่างนี้

Reading file in PHP

การเขียนข้อมูลลงบนไฟล์ในภาษา PHP

ต่อไปเป็นตัวอย่างของการเขียนข้อมูลลงไปบน Text file ในภาษา PHP ด้วยฟังก์ชัน fwrite() ในโปรแกรมของเราจะเป็นการบันทึก log ของผู้ที่เข้าชมเว็บไซต์ โดยทำการบันทึกหมายเลข IP และ URL ที่ร้องขอ

<?php

$handle = fopen("c:\\project\\marcuscode_access_log.txt", "w");

if ($handle) {

    fwrite($handle, "127.0.0.1 requests /\r\n");
    fwrite($handle, "127.0.0.1 requests /tutorials\r\n");
    fwrite($handle, "127.0.0.1 requests /lang/php\r\n");
    fwrite($handle, "127.0.0.1 requests /about\r\n");

    fclose($handle);
} else {
    echo "Error opening file.\n";   
}

?>

ในตัวอย่าง เป็นโปรแกรมในการเขียนข้อมูลลงใน Text files เพื่อเขียนข้อมูลเราได้ใช้ฟังก์ชัน fopen() เปิดไฟล์โดยมีโหมดในการเปิดเป็น "w" ซึ่งหมายถึงโปรแกรมจะเปิดไฟล์ที่ระบุหากมีไฟล์อยู่แล้วจะลบไฟล์เดิมทิ้งและสร้างไฟล์ใหม่ขึ้นมา และถ้าหากไม่มีไฟล์ดังกล่าวอยู่จะสร้างไฟล์ขึ้นมาใหม่ และก่อนจะใช้เราได้ทำการตรวจสอบการถ้าหากการเปิดไม่มีข้อผิดพลาดใดๆ ด้วยคำสั่ง If

fwrite($handle, "127.0.0.1 requests /\r\n");
fwrite($handle, "127.0.0.1 requests /tutorials\r\n");
fwrite($handle, "127.0.0.1 requests /lang/php\r\n");
fwrite($handle, "127.0.0.1 requests /about\r\n");

ต่อไปเป็นการเขียนข้อมูลลงไฟล์ทีละบรรทัดดด้วยฟังก์ชัน fwrite() ซึ่งพารามิเตอร์ตัวแรกเป็น file resource และตัวที่สองเป็น String ที่เราต้องการเขียนลงไปในไฟล์ เนื่องจากในตัวอย่างเราได้เขียนข้อมูลลงไฟล์ทีละบรรทัด ดังนั้นเราจะใช้ \r\n สำหรับการขึ้นบรรทัดใหม่ และเปิดการทำงานของไฟล์ด้วยฟังก์ชัน fclose() หลังจากการเขียนเสร็จสิ้น และเราได้เขียนข้อมูลเป็นจำนวน 4 บรรทัดลงไปในไฟล์

Writing to text file PHP

นี่เป็นผลลัพธ์การทำงานของโปรแกรมในไฟล์ marcuscode_access_log.txt

การเขียนข้อมูลลงบนไฟล์ต่อท้ายไฟล์เดิม (File appending)

โดยทั่วไปแล้ว เมื่อเราทำการเปิดไฟล์ในโหมด "w" โปรแกรมจะทำการสร้างไฟล์ขึ้นมาใหม่เสมอ นั่นหมายความว่าข้อมูลที่เขียนไปก่อนหน้าจะถูกลบออกไปด้วย ซึ่งในบางทีเราอาจจะต้องการเขียนข้อมูลต่อท้ายไฟล์เดิมโดยที่ข้อมูลเดิมยังคงอยู่ คุณสามารถเปิดไฟล์ไฟล์ด้วยโหมด "a+" เพื่อเป็นการเปิดไฟล์เพื่ออ่าหรือเขียนต่อท้ายไฟล์เดิม มาดูตัวอย่างการเขียนไฟล์ต่อท้ายไฟล์เดิมในภาษา PHP หรือที่เรียกกันว่า File appending

<?php

$handle = fopen("c:\\project\\the_bible.txt", "a+");

if ($handle) {

    fwrite($handle, "Genesis 1:1\r\n");
    fwrite($handle, "In the beginning God created the heavens and the earth. ");
    fwrite($handle, "The earth was formless and void, ");
    fwrite($handle, "and darkness was over the surface of the deep,");
    fwrite($handle, "and the Spirit of God was moving over the surface of the waters.\r\n");

    fclose($handle);
} else {
    echo "Error opening file.\n";   
}

?>

ในตัวอย่าง เราได้เขียนข้อมูลจาก Genesis 1:1 ลงไปในไฟล์ the_bible.txt สิ่งที่แตกต่างกับตัวอย่างก่อนหน้าคือในการเปิดไฟล์เราเปิดด้วยโหมด "a+" แทน ทุกๆ ครั้งที่เรารันโปรแกรม จะเขียนไฟล์ต่อท้ายจากไฟล์เดิม นั่นหมายความว่าขนาดของไฟล์จะใหญ่ขึ้นไปเรื่อยๆ

File appending in PHP

นี่เป็นตัวอย่างของโปรแกรมเมื่อเราได้รันสคริป PHP สองครั้ง ในครั้งแรกโปรแกรมจะสร้างไฟล์ the_bible.txt ขึ้นมาและเขียนข้อมูลลงไป และครั้งที่สองโปรแกรมจะเขียนข้อมูลต่อท้าย

ในการเขียนไฟล์ต่อท้ายไฟล์นี้ ใช้เป็นจำนวนมากในการเขียนโปรแกร เช่น การเก็บ log ของโปรแกรมที่เก็บข้อมูลคนละเวลากัน และยังต้องการเก็บข้อมูเดิมไว้อยู่ อย่างไรก็ตามในการเก็บข้อมูลเป็นจำวนมากนั้นไม่ควรเก็บลงในไฟล์เดียว เพราะจะทำให้เกิดความล่าช้าในการอ่านข้อมูล คุณอาจจะแยก log เป็นวันหรือเดือนถ้าเป็นไปได้

ในบทนี้ คุณได้เรียนรู้เกี่ยวกับการอ่านข้อมูลจากไฟล์ การเขียนข้อมูลลงไปในไฟล์ และการเขียนข้อมูลแบบต่อท้ายไฟล์ที่เรีบกว่า File appending ในภาษา PHP

บทความนี้เป็นประโยชน์หรือไม่?Yes·No