เปิด PHP OPcache บน cPanel เพิ่มความเร็วเว็บ PHP ทันที

OPcache เก็บ PHP Bytecode ไว้ใน Memory ไม่ต้อง Compile ซ้ำทุก Request ช่วยเพิ่มความเร็วได้ชัดเจน

PHP OPcache บน cPanel Hosting

PHP OPcache คืออะไรและทำงานอย่างไร

PHP OPcache (Opcode Cache) คือ Extension ของ PHP ที่มีติดมาให้ตั้งแต่ PHP 5.5 เป็นต้นมา ทำหน้าที่เก็บผลลัพธ์จากการ Compile ไฟล์ PHP ในรูปแบบ Bytecode ไว้ใน Memory ของ Server โดยตรง เมื่อมี Request เข้ามาครั้งถัดไป PHP จะข้ามขั้นตอนการอ่านและ Compile ไฟล์ใหม่ แล้วดึง Bytecode ที่เก็บไว้มาใช้ได้ทันที ทำให้ Response Time ลดลงอย่างมีนัยสำคัญ

โดยปกติแล้วทุกครั้งที่มีการเรียกไฟล์ PHP เช่น index.php หรือ wp-blog-header.php PHP Engine จะต้องทำงาน 3 ขั้นตอน ได้แก่ อ่านไฟล์จาก Disk, แปลงโค้ดเป็น Opcode (Bytecode), และ Execute Opcode นั้น OPcache ตัดขั้นตอนที่ 1 และ 2 ออกไปสำหรับ Request ถัดๆ ไป เหลือแค่ขั้นตอน Execute อย่างเดียว ซึ่งทำให้เร็วขึ้นอย่างเห็นได้ชัด

ผลการทดสอบจากหลายแหล่งพบว่า WordPress ที่เปิด OPcache สามารถ Handle Request ได้มากขึ้น 2–4 เท่า และ Time to First Byte (TTFB) ลดลงได้ถึง 50–70% โดยเฉพาะเว็บที่มีไฟล์ PHP จำนวนมาก เช่น WooCommerce หรือเว็บที่ใช้ Plugin เยอะ

ตรวจสอบว่า OPcache เปิดอยู่แล้วหรือเปล่า

ก่อนจะเปิด OPcache ควรตรวจสอบก่อนว่า Hosting ของคุณเปิดให้อยู่แล้วหรือไม่ เพราะ Hosting หลายเจ้าในปัจจุบันเปิด OPcache เป็น Default อยู่แล้ว โดยเฉพาะ Hosting ที่ใช้ PHP 7.x ขึ้นไป วิธีที่ง่ายที่สุดคือสร้างไฟล์ phpinfo.php แล้วเปิดดูผ่านเบราว์เซอร์

วิธีสร้างไฟล์ตรวจสอบ: ไปที่ cPanel ของคุณ คลิก File Manager เปิดโฟลเดอร์ public_html สร้างไฟล์ใหม่ชื่อ phpinfo.php แล้วใส่โค้ดข้างล่างนี้ลงไป จากนั้นเปิด Browser ไปที่ yoursite.com/phpinfo.php แล้วกด Ctrl+F ค้นหาคำว่า "opcache"

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

เปิด OPcache ผ่าน php.ini ใน cPanel

ถ้าตรวจสอบแล้วพบว่า OPcache ยังปิดอยู่ คุณสามารถเปิดได้ผ่าน php.ini ใน cPanel โดยไม่ต้องมีสิทธิ์ Root ไปที่ cPanel แล้วค้นหา "MultiPHP INI Editor" หรือ "PHP Configuration" ในส่วน Software แล้วเลือก Document Root ของเว็บไซต์ที่ต้องการ

ใน MultiPHP INI Editor มี 2 โหมด ได้แก่ Basic Mode ที่มีตัวเลือก Checkbox และ Editor Mode ที่ให้แก้ไข php.ini ได้โดยตรง สำหรับการเปิด OPcache แนะนำให้ใช้ Editor Mode เพราะสามารถใส่ค่าได้ครบถ้วนกว่า โดยเพิ่มบรรทัดดังนี้

หลังจากบันทึก php.ini แล้ว ให้รีเฟรชเว็บไซต์และตรวจสอบด้วย phpinfo.php อีกครั้ง บางครั้ง Hosting อาจต้องการเวลาไม่กี่วินาทีในการโหลดการตั้งค่าใหม่ ถ้ายังไม่เห็นผลลัพธ์ลองรอสัก 1–2 นาทีแล้วตรวจสอบอีกครั้ง

ตั้งค่า OPcache ที่เหมาะสมสำหรับ WordPress

WordPress มีไฟล์ PHP จำนวนมาก ทั้ง Core, Theme และ Plugin ดังนั้นการตั้งค่า OPcache ให้เหมาะสมจะช่วยให้ประสิทธิภาพดีขึ้นอย่างเห็นได้ชัด ค่าที่สำคัญที่สุดคือ opcache.memory_consumption ซึ่งกำหนดพื้นที่ Memory ที่จะใช้เก็บ Bytecode ถ้าค่านี้น้อยเกินไป OPcache จะต้องล้าง Cache บ่อย ส่งผลให้ประสิทธิภาพตก

สำหรับ WordPress ทั่วไปที่มี Plugin ประมาณ 10–20 ตัว ควรตั้ง Memory ไว้ที่ 128MB ขึ้นไป ถ้าเป็น WooCommerce หรือมี Plugin จำนวนมากให้ตั้งที่ 256MB ค่า opcache.max_accelerated_files ควรสูงพอที่จะรองรับจำนวนไฟล์ PHP ทั้งหมดในเว็บ โดย WordPress มาตรฐานมีไฟล์ PHP ประมาณ 3,000–10,000 ไฟล์

ค่า opcache.revalidate_freq กำหนดว่า OPcache จะตรวจสอบว่าไฟล์ PHP มีการเปลี่ยนแปลงหรือไม่บ่อยแค่ไหน (หน่วยเป็นวินาที) ในระหว่าง Development ควรตั้งเป็น 0 เพื่อให้ตรวจสอบทุก Request แต่ใน Production ควรตั้งเป็น 60–120 วินาที เพื่อลด Disk I/O

ค่าที่ตั้ง Development WordPress ทั่วไป WooCommerce / Site ใหญ่
opcache.memory_consumption 64 128 256
opcache.max_accelerated_files 4000 10000 20000
opcache.revalidate_freq 0 60 120
opcache.interned_strings_buffer 8 16 32
opcache.validate_timestamps 1 1 1

วัด Performance ก่อนและหลัง OPcache

เพื่อให้เห็นผลลัพธ์ชัดเจน ควรวัด Performance ก่อนเปิด OPcache แล้วเปรียบเทียบกับหลังเปิด โดยใช้เครื่องมือฟรีที่หาได้ง่าย ได้แก่ Google PageSpeed Insights, GTmetrix หรือ WebPageTest เครื่องมือเหล่านี้จะแสดง Time to First Byte (TTFB) ซึ่งเป็นตัวชี้วัดสำคัญที่ OPcache มีผลโดยตรง

ตัวชี้วัดที่ควรบันทึกก่อนเปิด OPcache ได้แก่ TTFB (ควรลดลงหลังเปิด), Total Page Load Time, Server Response Time และ PHP Processing Time ถ้าใช้ New Relic หรือ Query Monitor (WordPress Plugin) จะเห็นเวลา PHP Processing แบบละเอียดยิ่งขึ้น

สำหรับผู้ที่ต้องการทดสอบแบบ Benchmark สามารถใช้ Apache Bench (ab) หรือ wrk เพื่อส่ง Request จำนวนมากและดู Requests per Second ก่อน-หลังเปิด OPcache ซึ่งจะเห็นความแตกต่างชัดเจนมาก โดยทั่วไปเว็บ WordPress จะ Handle Request ได้เพิ่มขึ้น 2–4 เท่าเมื่อเปิด OPcache

แก้ปัญหา Cache เก่าหลัง Deploy Code ใหม่

หนึ่งในปัญหาที่พบบ่อยที่สุดเมื่อใช้ OPcache คือหลังจากอัพเดท Code หรือ Plugin แล้ว เว็บยังแสดงเนื้อหาเก่าอยู่ เพราะ OPcache ยังเก็บ Bytecode เก่าไว้ใน Memory วิธีแก้ที่ถูกต้องคือการล้าง OPcache หลังจาก Deploy หรืออัพเดทไฟล์ PHP ทุกครั้ง

สำหรับ WordPress มี Plugin ที่ช่วยล้าง OPcache ได้สะดวก เช่น "OPcache Manager" หรือ "Nginx Cache" ซึ่งมีปุ่ม Clear OPcache ในหน้า Dashboard หรือจะเขียน Script PHP สั้นๆ ไว้ใช้เอง แล้ว Call ผ่าน URL เมื่อต้องการล้าง Cache ก็ได้ แต่ต้องระวังเรื่องความปลอดภัย ควรใส่ Password ป้องกัน

ถ้าใช้ Git หรือ Deployment Script ควรเพิ่มขั้นตอนล้าง OPcache ต่อจาก Deploy อัตโนมัติ โดยสร้าง Endpoint PHP ที่ตรวจสอบ Secret Token ก่อนจะเรียก opcache_reset() แล้วให้ Deployment Script เรียก URL นั้นหลัง Push Code เสร็จ

ตรวจสอบว่า OPcache เปิดใช้งานถูกต้อง

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

<?php
// ไฟล์: check-opcache.php (ลบออกหลังใช้งาน!)

// 1. ตรวจสอบว่า OPcache Extension โหลดอยู่
echo "OPcache Loaded: ";
echo extension_loaded('Zend OPcache') ? "YES" : "NO";
echo "\n\n";

// 2. ดูสถานะและสถิติของ OPcache
$status = opcache_get_status(false);
echo "OPcache Enabled: " . ($status['opcache_enabled'] ? 'YES' : 'NO') . "\n";
echo "Cache Full: " . ($status['cache_full'] ? 'YES (เพิ่ม Memory!)' : 'NO') . "\n";
echo "Hit Rate: " . round($status['opcache_statistics']['opcache_hit_rate'], 2) . "%\n";
echo "Hits: " . $status['opcache_statistics']['hits'] . "\n";
echo "Misses: " . $status['opcache_statistics']['misses'] . "\n";
echo "Cached Files: " . $status['opcache_statistics']['num_cached_files'] . "\n\n";

// 3. ดูการตั้งค่า Configuration
$config = opcache_get_configuration();
echo "Memory Consumption: " . $config['directives']['opcache.memory_consumption'] . "MB\n";
echo "Max Accelerated Files: " . $config['directives']['opcache.max_accelerated_files'] . "\n";
echo "Revalidate Freq: " . $config['directives']['opcache.revalidate_freq'] . " วินาที\n\n";

// 4. ล้าง OPcache ด้วยตนเอง (uncomment เมื่อต้องการ)
// opcache_reset();
// echo "OPcache Cleared!\n";

// 5. ตรวจสอบ Memory Usage
$memory = $status['memory_usage'];
$used = round($memory['used_memory'] / 1024 / 1024, 2);
$free = round($memory['free_memory'] / 1024 / 1024, 2);
echo "Memory Used: {$used}MB / Free: {$free}MB\n";
?>
Tip: สร้างไฟล์ phpinfo.php แล้วเปิดดู ค้นหา "opcache" ควรเห็น Zend OPcache section แสดงว่า opcache.enable=On ถ้าไม่เห็น Section นี้แปลว่ายังไม่ได้เปิด นอกจากนี้ให้ดูค่า Hit Rate ในไฟล์ check-opcache.php ถ้าสูงกว่า 90% แสดงว่า OPcache ทำงานได้ดีมาก ถ้าต่ำกว่า 80% อาจต้องเพิ่ม opcache.max_accelerated_files หรือ opcache.memory_consumption

แก้ปัญหาที่พบบ่อย

OPcache เปิดแล้วแต่เว็บยังช้า — ต้องตั้งค่า opcache.memory_consumption ให้มากพอ

ปัญหานี้มักเกิดจาก Memory ที่จัดสรรให้ OPcache น้อยเกินไป เมื่อ Memory เต็ม OPcache จะเข้าสู่ Cache Full State และหยุด Cache ไฟล์ใหม่ บางกรณีอาจต้องล้าง Cache เก่าออกบ่อยๆ ซึ่งทำให้เสียประสิทธิภาพ ให้ตรวจสอบค่า cache_full จาก opcache_get_status() ถ้าเป็น true ให้เพิ่ม opcache.memory_consumption เป็น 128MB หรือ 256MB แล้วตรวจสอบอีกครั้ง

ไฟล์ PHP แก้แล้วแต่เว็บยังแสดงเนื้อหาเก่า — OPcache Cache เก่าอยู่ ต้อง Clear

เมื่อแก้ไขไฟล์ PHP แล้ว OPcache ยังเก็บ Bytecode เก่าไว้ถ้า opcache.revalidate_freq ตั้งไว้สูง วิธีแก้ทันทีคือเรียก opcache_reset() หรือ opcache_invalidate($filepath, true) สำหรับไฟล์เฉพาะ ถ้าต้องการให้ตรวจสอบอัตโนมัติในระหว่าง Development ให้ตั้ง opcache.validate_timestamps=1 และ opcache.revalidate_freq=0 ซึ่งจะตรวจสอบทุก Request แต่ใช้กับ Production ไม่ได้เพราะจะเสียประสิทธิภาพ

WordPress Plugin ทำงานผิดปกติหลังเปิด OPcache — Compatibility Issue ต้องทดสอบ

Plugin บางตัว โดยเฉพาะ Plugin ที่ใช้ PHP Annotations หรือ Doctrine ORM อาจต้องการให้ opcache.save_comments=1 (ค่า Default) เพราะต้องอ่าน PHP DocBlock Comments สำหรับ Metadata ถ้าตั้ง save_comments=0 Plugin เหล่านี้จะทำงานผิดพลาด วิธีทดสอบคือปิด OPcache ชั่วคราวแล้วดูว่า Plugin กลับมาทำงานปกติหรือไม่ ถ้าใช่ให้ตั้ง opcache.save_comments=1 และ opcache.load_comments=1

php.ini ไม่มีผล — ต้องแก้ถูก php.ini Level ของ Hosting

ใน cPanel มี php.ini หลาย Level ได้แก่ System Level, Virtual Host Level และ Directory Level (.htaccess) ถ้าแก้ผิด Level การตั้งค่าจะไม่มีผล วิธีตรวจสอบว่า php.ini ของคุณถูกใช้จริงหรือไม่คือ เพิ่มค่าที่ไม่เคยตั้งมาก่อน เช่น max_execution_time=777 แล้วดูใน phpinfo.php ว่าค่านี้ปรากฏขึ้นไหม ถ้าไม่ปรากฏแสดงว่าแก้ผิดไฟล์ ให้ใช้ MultiPHP INI Editor ใน cPanel แทนการแก้ไฟล์โดยตรง

คำถามที่พบบ่อย

OPcache ต่างจาก WordPress Caching Plugin อย่างไร ต้องใช้ทั้งคู่ไหม?

OPcache และ WordPress Caching Plugin ทำงานคนละ Layer กัน OPcache ทำงานใน PHP Engine Level โดย Cache Bytecode ของ PHP ไว้ใน Server Memory ซึ่งช่วยเรื่อง Server Processing Time ส่วน WordPress Caching Plugin เช่น WP Rocket, W3 Total Cache หรือ LiteSpeed Cache จะ Cache HTML Output ที่สร้างเสร็จแล้ว ทำให้ Visit ถัดไปไม่ต้องรัน PHP เลย แนะนำให้ใช้ทั้งคู่ร่วมกัน เพราะทำงานเสริมกัน: OPcache เร่ง PHP Processing และ Caching Plugin ลด PHP Execution ที่ไม่จำเป็น

Shared Hosting จำกัด OPcache Memory ไหม ใช้ร่วมกับ User อื่นหรือเปล่า?

บน Shared Hosting OPcache Memory มักถูกจำกัดโดย Hosting Provider ค่าที่ได้รับจะน้อยกว่า VPS หรือ Dedicated Server โดยทั่วไป Hosting จะแบ่ง OPcache Memory เป็น Per-User หรือ Per-PHP-Worker ไม่ใช่แบ่งกัน Pool เดียวกันทั้ง Server ดังนั้น Code ของคุณจะไม่ไปปะปนกับ User คนอื่น แต่ขนาด Memory ที่ได้รับอาจถูกจำกัดไว้ที่ 64–128MB ขึ้นอยู่กับ Plan ที่ใช้ ถ้าเว็บมีไฟล์ PHP จำนวนมากและต้องการ OPcache Memory มากกว่านี้ ควรพิจารณาอัพเกรดเป็น VPS

เมื่อไหร่ OPcache จะ Expire และ Recompile โดยอัตโนมัติ?

OPcache จะ Recompile ไฟล์ PHP อัตโนมัติใน 3 กรณี ได้แก่ 1) ไฟล์มีการเปลี่ยนแปลง (Timestamp เปลี่ยน) และ opcache.validate_timestamps=1 โดยตรวจสอบตามค่า opcache.revalidate_freq เช่น ทุก 60 วินาที, 2) เมื่อ Cache เต็มและต้องการเพิ่มไฟล์ใหม่ OPcache จะ Evict ไฟล์เก่าออก, 3) เมื่อ PHP-FPM หรือ Web Server Restart จะล้าง Cache ทั้งหมด ถ้าตั้ง opcache.validate_timestamps=0 OPcache จะไม่ตรวจสอบการเปลี่ยนแปลงเลย ซึ่งเร็วที่สุดแต่ต้องล้าง Cache ด้วยตนเองทุกครั้งที่ Deploy

Hosting ที่เปิด PHP OPcache ให้ตั้งแต่ต้น ช่วยให้เว็บ PHP เร็วโดยไม่ต้องปรับอะไรเพิ่ม asiagb.com มี Shared Hosting พร้อม DirectAdmin ที่จัดการง่าย ตรวจสอบ DNS และ Performance ของโดเมนก่อนย้ายได้ที่ dnsxray.com