วันอาทิตย์ที่ 28 พฤษภาคม พ.ศ. 2560

สร้างคิวไฟล์(queue file)แบบเท็กซ์ไฟล์แบบง่ายโดยใช้โปรแกรม php

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

สำหรับการใช้งานคิวไฟล์เองก็ไม่ยุ่งยาก เช่นหากต้องการเพิ่มข้อมูลเข้าไปในคิวไฟล์ก็ใช้คำสั่ง enqueue() หากต้องการดึงข้อมูลออกจากคิวไฟล์ก็แค่ใช้คำสั่ง dequeue() และหากต้องการให้คิวไฟล์สามารถจัดเก็บข้อมูลในเท็กซ์ไฟล์ก็ใช้คำสั่ง save() นับว่าการใช้งานสามารถนำไปประยุกต์ใช้งานได้อย่างมากมาย


สำหรับข้อเสียที่ผู้เขียนพบเจอของการใช้งานแบบคิวไฟล์นี้ก็คือ ข้อมูลในไฟล์ที่ถูกเก็บจะปนกัน หากมีหลาย ๆ เซสชั่นดำเนินการจัดเก็บไฟล์พร้อม ๆ กัน เนื่องด้วยกระบวนการจัดเก็บไฟล์เองไม่ได้ป้องกันปัญหานี้ไว้ ซึ่งปัญหานี้หากใช้งานในระบบใหญ่ ๆ ก็ไม่สามารถนำไปใช้งานได้ เพราะจะเกิดการแข้งขันการจัดเก็บข้อมูลตลอดเวลา การใช้เทคนิคคิวไฟล์นี้ แนะนำให้เป็นศึกษาหาความรู้ความเข้าใจเบื้องต้นก่อนจะนำไปประยุกต์ใข้ด้วยเครื่องมืออื่น ๆ ต่อไป

ขั้นตอนการสร้างคิวไฟล์แบบเท็กซ์ไฟล์แบบง่ายโดยใช้โปรแกรม php

ขั้นตอนที่ 1 ในการสร้างการป้อนข้อมูลเข้าคิวไฟล์ ผู้เขียนแนะนำให้ใช้โค๊ดอย่างง่าย ๆ ที่แปะไว้ให้ข้างล่างนี้ โดย include เป็นการเรียกใช้งานคลาสคิวไฟล์ คำสั่ง new เป็นการสร้างออปเจคขึ้นมาใหม่ เมทธอด enqueue เป็นการป้อนข้อมูลเข้าคิวไฟล์ จากนั้นทำการ save ลงในเท็กซ์ไฟล์

<?php
include "queue/TitleManager.php";
$qt = new TitleManager();
$qt->enqueue($msgs);
$qt->save();
?>

ขั้นตอนที่ 2 เป็นการสร้างโค๊ดสำหรับดึงข้อมูลออกจากคิวไฟล์ include เป็นการเรียกใช้งานคลาสคิวไฟล์ คำสั่ง new เป็นการสร้างออปเจคขึ้นใหม่ ส่วนเมทธอด dequeue เป็นการอ่านค่าจากคิวไฟล์ในตำแหน่งที่พอยเตอร์อยู่ และเมทธอด save เป็นการบันทึกข้อมูลลงเท็กซ์ไฟล์

<?php
include "queue/TitleManager.php";
qt = new TitleManager();
$msg = $qt->dequeue();
$qt->save();
?>   

ขั้นตอนที่ 3 เป็นการสร้างไฟล์สำหรับคลาสคิวไฟล์ ให้ตั้งชื่อว่า TitleManager.php

<?php

// Title Manager class (essentially a queue) that uses a simple text file for storage
class TitleManager {
        private $filename = "/tmp/gpsmessages.txt";
        private $queueLimit = 10000;
        private $titles;

        // Upon creation, load up our titles from the file
        public function __construct() {
                $this->titles = array();
                $this->loadTitles();
        }


        private function loadTitles() {
                if (file_exists($this->filename)) {
                        $this->titles = file($this->filename, FILE_SKIP_EMPTY_LINES);
                }
        }

        // Add a title to the queue and if we are at our limit, drop one off the end.
        public function enqueue($strTitle) {
                if (!empty($strTitle)) {
                        array_unshift($this->titles, $strTitle . "\n");

                        if (count($this->titles) > $this->queueLimit) {
                                $this->dequeue();
                        }
                }
        }

        // Remove a title item from the end of our list
        public function dequeue() {
                if (count($this->titles) > 0) {
                        return trim(array_pop($this->titles));
                }
                return "";
        }

        // Save the contents of our array back to the file.
        public function save() {
                if (file_put_contents($this->filename, $this->titles)) {
                        return true;
                }
                return false;
        }


        // Check if an item is already in our list.
        // Note: We could have also used in_array here instead of a loop.
        public function isTitlePresent($strTitle = "") {
                if (!empty($strTitle)) {
                        foreach ($this->titles as $title) {
                                $trimmedTitle = trim($title);
                                $strTitle = trim($strTitle);
                                if (strtolower($strTitle) == strtolower($trimmedTitle)) { return true; }
                        }

                        return false;
                }
                return -1;
        }


        // Mainly a debug function to print our values to screen.
        public function printValues() {
                foreach ($this->titles as $value) {
                        echo "$value<br/>";
                }
        }
}
?>


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

ส่วนวิธีการที่ดีกว่าการใช้คิวแบบเท็กซ์ไฟล์ ผู้เขียนได้ทดลองใช้งานอยู่ในปัจจุบันก็คือ "beanstalk" นั่นเองจัดว่าเป็นโปรแกรมจัดการคิวแบบง่าย ๆ ที่มีประสิทธิภาพสูง ซึ่งผู้เขียนจะได้นำเสนอบทความการใช้งาน beanstalk กันอีกครั้งหนึ่งในภายภาคหน้า เนื้อหาดี ๆเหล่านี้จะสำเร็จลุล่วงไปไม่ได้เลย หากไม่ได้รับการสนับสนุนจาก บจก.ไทย พรอสเพอรัส ไอที ผู้นำด้านการให้บริการระบบจีพีเอสติดตามรถยนต์ อันดับหนึ่งของประเทศไทย ดำเนินการด้วยทีมงานวิศวกร ช่วยให้รถยนต์ของเราไม่พลาดการเชื่อมต่อ




ไม่มีความคิดเห็น:

แสดงความคิดเห็น