โดยปกติแล้ว 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 ครับ
- เปิดไฟล์
php.iniของคุณขึ้นมา - ค้นหาบรรทัดด้านล่างนี้ (ถ้ามีเครื่องหมาย
;อยู่ข้างหน้า ให้ลบออกเพื่อเปิดใช้งาน)
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 ครับ
อ่านเพิ่มเติม