ป้ายกำกับ: chunked-upload

PHP: การใช้ Chunked Upload สำหรับการอัปโหลดไฟล์ขนาดใหญ่PHP: การใช้ Chunked Upload สำหรับการอัปโหลดไฟล์ขนาดใหญ่

ในโลกของการพัฒนาเว็บสมัยใหม่ การจัดการไฟล์ขนาดใหญ่ เช่น วิดีโอความละเอียดสูง หรือชุดข้อมูล (Datasets) ขนาดหลายร้อยเมกะไบต์ เป็นเรื่องปกติ แต่ PHP และข้อจำกัดของเซิร์ฟเวอร์ (เช่น memory_limit หรือ max_execution_time) มักเป็นอุปสรรคสำคัญในการอัปโหลดไฟล์เหล่านี้ด้วยวิธีปกติ

เพื่อแก้ไขปัญหานี้ Chunked Upload จึงเป็นสถาปัตยกรรมที่จำเป็นอย่างยิ่ง เทคนิคนี้ช่วยให้เราสามารถแบ่งไฟล์ขนาดมหึมาออกเป็นส่วนย่อย ๆ ที่จัดการได้ (Chunks) และส่งผ่าน HTTP อย่างต่อเนื่อง ทำให้การอัปโหลดมีความเสถียรและทนทานต่อการขัดข้องของเครือข่าย

⚙️ Chunked Upload คืออะไร และทำงานอย่างไร?

Chunked Upload คือกระบวนการที่แบ่งไฟล์ต้นฉบับออกเป็นส่วนย่อย ๆ ที่มีขนาดคงที่ (เช่น ส่วนละ 5MB) โดยที่ฝั่ง Client (JavaScript) จะทำหน้าที่ส่งแต่ละส่วนไปยัง API Endpoint ของ PHP ทีละส่วน เมื่อ PHP ได้รับ Chunk ทั้งหมดแล้ว จะทำการรวบรวมและประกอบชิ้นส่วนเหล่านั้นกลับเป็นไฟล์ที่สมบูรณ์

🚀 บทบาทของ PostgreSQL ในระบบ Chunked Upload

ในฐานะ Senior Architect การจัดการไฟล์ขนาดใหญ่ไม่ได้จบแค่การบันทึกไฟล์เท่านั้น แต่ยังรวมถึงการจัดการสถานะ (State Management) ด้วย ในระบบที่ใช้ PostgreSQL เราจะใช้ฐานข้อมูลนี้ในการบันทึก Metadata ของการอัปโหลดแต่ละ Chunk เพื่อให้ระบบทราบว่าไฟล์นี้มีกี่ส่วนแล้ว ส่วนไหนขาดหายไป และสถานะการอัปโหลดโดยรวมเป็นอย่างไร

  1. Client-Side (JavaScript): ทำการแบ่งไฟล์และส่ง Chunk พร้อมระบุ ID ของไฟล์และลำดับ (Index) ของ Chunk นั้น ๆ
  2. Server-Side (PHP): รับ Chunk เข้ามา จากนั้นก่อนบันทึกไฟล์ชั่วคราว จะต้องบันทึกข้อมูลสถานะลงใน PostgreSQL ก่อนเสมอ
  3. PostgreSQL: ทำหน้าที่เป็นแหล่งความจริง (Source of Truth) โดยเก็บตาราง upload_chunks เพื่อติดตามว่า Chunk ลำดับที่ 1, 2, 3… ถูกรับมาแล้วหรือไม่
  4. Assembly: เมื่อได้รับ Chunk ครบตามจำนวนที่คาดไว้ PHP จะส่งคำสั่งสุดท้ายเพื่อรวมไฟล์ชั่วคราวและล้างข้อมูลสถานะใน PostgreSQL

💻 ตัวอย่างการจัดการสถานะ Chunk ด้วย PHP และ PostgreSQL

สมมติว่าเรามีตาราง upload_chunks ใน PostgreSQL เพื่อติดตามการอัปโหลด:

SQL

-- Table Schema สำหรับติดตามสถานะการอัปโหลดไฟล์ชิ้นส่วน<br>CREATE TABLE upload_chunks (<code><br>    chunk_id SERIAL PRIMARY KEY,<br>    file_uuid UUID NOT NULL,<br>    chunk_index INT NOT NULL,<br>    chunk_size INT NOT NULL,<br>    received_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP<br>);

เมื่อ PHP รับ Chunk เข้ามา (เช่น Chunk ลำดับ 2 ของไฟล์ UUID ‘a1b2c3d4’) จะต้องรันคำสั่งต่อไปนี้:

SQL

INSERT INTO upload_chunks (file_uuid, chunk_index, chunk_size) <br>VALUES ('a1b2c3d4', 2, 5242880) <br>ON CONFLICT (file_uuid, chunk_index) DO NOTHING;

การใช้ ON CONFLICT ช่วยให้มั่นใจว่าเราจะไม่บันทึกข้อมูลซ้ำซ้อน หากมีการส่ง Chunk ซ้ำเข้ามา

✅ บทสรุป: ความเสถียรที่เหนือกว่า

การใช้ Chunked Upload ร่วมกับการจัดการสถานะด้วย PostgreSQL ทำให้ระบบอัปโหลดไฟล์ขนาดใหญ่มีความทนทาน (Resilience) สูงมาก หากการเชื่อมต่อขาดหายระหว่างการอัปโหลด ระบบสามารถตรวจสอบจาก PostgreSQL ว่า Chunk ใดที่ยังขาดหายไป และสามารถให้ผู้ใช้เริ่มส่งต่อจาก Chunk ลำดับถัดไปได้โดยไม่สูญเสียข้อมูล นี่คือมาตรฐานของสถาปัตยกรรม Backend ที่เชื่อถือได้สำหรับการจัดการข้อมูลขนาดใหญ่ในยุคปัจจุบัน