ป้ายกำกับ: ฟังก์ชัน

🚀 OPcache: ตัวช่วยเร่งสปีดให้ PHP🚀 OPcache: ตัวช่วยเร่งสปีดให้ PHP

โดยปกติแล้ว PHP เป็น Interpreted Language หมายความว่าทุกครั้งที่มีคนกดเข้าหน้าเว็บ server จะต้องอ่านไฟล์โค้ด PHP, แปลงเป็นโค้ดที่คอมพิวเตอร์เข้าใจ (เรียกว่า Bytecode หรือ Opcode) แล้วจึงประมวลผลผลลัพธ์ออกมาเป็นหน้าเว็บ

ลองจินตนาการว่าถ้าเว็บของคุณมีคนเข้าพร้อมกัน 1,000 คน Server ก็ต้องมานั่ง “แปลภาษา” โค้ดชุดเดิมซ้ำ ๆ ถึง 1,000 ครั้ง ซึ่งเป็นเรื่องที่กินพลังงานและเสียเวลามากครับ


OPcache เข้ามาช่วยอย่างไร?

OPcache (Optimizer Plus) จะเข้ามาทำหน้าที่เป็น “คนจดจำ” โดยมันจะเซฟ Bytecode ที่แปลเสร็จเรียบร้อยแล้วเก็บไว้ใน Shared Memory (RAM) เมื่อมีคำขอเข้าหน้าเว็บเดิมในครั้งต่อไป PHP ไม่ต้องเสียเวลาอ่านไฟล์และแปลโค้ดใหม่อีกรอบ แต่สามารถดึง Bytecode จาก RAM ไปประมวลผลได้ทันที ทำให้ลดภาระการทำงานของ CPU และช่วยให้เว็บโหลดเร็วขึ้นอย่างเห็นได้ชัด


🛠 วิธีการเปิดใช้งาน OPcache

ใน PHP เวอร์ชันปัจจุบัน (PHP 7.0 ขึ้นไปจนถึง PHP 8.x) OPcache จะถูกติดตั้งมาพร้อมกับ PHP อยู่แล้ว เหลือแค่เราเปิดใช้งานในไฟล์ php.ini ครับ

  1. เปิดไฟล์ php.ini ของคุณขึ้นมา
  2. ค้นหาบรรทัดด้านล่างนี้ (ถ้ามีเครื่องหมาย ; อยู่ข้างหน้า ให้ลบออกเพื่อเปิดใช้งาน)
opcache.enable=1
opcache.enable_cli=1 ; เปิดใช้งานสำหรับ PHP CLI ด้วย (เช่น แบ็กกราวด์จ็อบ หรือ Cron job)

⚙️ การตั้งค่า OPcache แนะนำสำหรับ Production

เพื่อให้ระบบเสถียรและเร็วที่สุด การปรับแต่งค่าคอนฟิกเหล่านี้ใน php.ini เป็นสิ่งสำคัญมากครับ

; 1. กำหนดขนาดแรมที่ให้ OPcache ใช้ (เริ่มต้นอาจจะ 128 ถ้าเว็บใหญ่หรือใช้ Framework อย่าง Laravel/Symfony แนะนำ 256 หรือ 512)
opcache.memory_consumption=256

; 2. ขนาดหน่วยความจำสำหรับเก็บ String ที่ใช้ซ้ำๆ
opcache.interned_strings_buffer=16

; 3. จำนวนไฟล์สูงสุดที่ระบบจะจำโค้ดไว้ (แนะนำให้ตั้งค่าสูงๆ ไว้ก่อน)
opcache.max_accelerated_files=20000

; 4. ปิดการเช็คว่าไฟล์โค้ดมีการแก้ไขไหม (เหมาะกับ Production ที่โค้ดนิ่งแล้ว เพื่อลด I/O ของดิสก์)
opcache.validate_timestamps=0

; 5. หากเปิด validate_timestamps เป็น 1 (เหมาะกับตอน Develop) ให้เช็คทุกๆกี่วินาที
; opcache.revalidate_freq=2

; 6. ช่วยให้โหลดคลาสและฟังก์ชันได้เร็วขึ้นใน PHP 7.4+
opcache.preload=/var/www/html/preload.php

⚠️ ข้อควรระวัง: หากคุณตั้งค่า opcache.validate_timestamps=0 บน Production เมื่อใดก็ตามที่คุณอัปเดตโค้ดใหม่ โค้ดจะไม่เปลี่ยนตามทันที เพราะ OPcache ยังจำโค้ดเก่าใน RAM อยู่ คุณจำเป็นต้องสั่ง Restart PHP-FPM หรือ Nginx/Apache หรือใช้ฟังก์ชัน opcache_reset() เพื่อล้างแคชเก่าทิ้งก่อนครับ


📊 ตารางเปรียบเทียบ: ก่อน และ หลัง เปิดใช้ OPcache

ฟีเจอร์ก่อนเปิด OPcache ❌หลังเปิด OPcache
ความเร็วในการตอบสนอง (Response Time)ช้ากว่า เพราะต้องแปลโค้ดใหม่ทุกครั้งเร็วขึ้น 2-3 เท่า (ดึงจาก RAM ทันที)
การทำงานของ CPUสูง เพราะต้องประมวลผล Compiler ตลอดเวลาต่ำลงอย่างเห็นได้ชัด
การใช้งาน RAMใช้น้อยกว่าในตอนเริ่มใช้ RAM เพิ่มขึ้นตามที่ตั้งค่าไว้ (แต่คุ้มค่าความเร็ว)
การอัปเดตโค้ดอัปโหลดไฟล์ปุ๊บ หน้าเว็บเปลี่ยนปั๊บอาจต้องสั่งล้างแคชก่อน โค้ดใหม่ถึงจะทำงาน

💡 สรุป

การเปิดใช้งาน PHP OPcache เป็นหนึ่งในวิธีที่ “ลงทุนน้อย แต่ได้ผลมหาศาล” ในการเพิ่มประสิทธิภาพให้เว็บไซต์ของคุณ โดยเฉพาะเว็บที่ขับเคลื่อนด้วยระบบ CMS ขนาดใหญ่อย่าง WordPress หรือ Framework อย่าง Laravel ครับ


อ่านเพิ่มเติม