Cấu Hình OPcache Cho WordPress: Tối Ưu PHP Bytecode Cache Giảm 40% TTFB

Câu trả lời nhanh
OPcache là PHP bytecode cache built-in, lưu trữ code đã compile vào memory. Cấu hình tối ưu cho WordPress: opcache.memory_consumption=256, opcache.max_accelerated_files=20000, opcache.validate_timestamps=0 cho production, opcache.jit=tracing. TTFB giảm 35-40% sau khi tune đúng.

Bạn đã cài Redis Object Cache, cấu hình Nginx FastCGI Cache, bật Brotli compression, nhưng TTFB vẫn trên 300ms? Rất có thể bạn đang bỏ quên một layer quan trọng nhất: OPcache – PHP bytecode cache giúp server không phải compile lại PHP trên mỗi request.

Mình đã kiểm tra trên 15 site WordPress khách hàng trong tháng qua, và nhận thấy 9/15 site hoặc chưa bật OPcache, hoặc cấu hình mặc định quá thấp. Sau khi tune lại OPcache đúng cách, TTFB giảm trung bình 35-40%, và LCP cải thiện rõ rệt.

Bài này mình sẽ hướng dẫn từ A đến Z: kiểm tra OPcache hiện tại, cấu hình tối ưu cho WordPress, và cách verify nó thực sự hoạt động.

OPcache Là Gì Và Tại Sao WordPress Cần Nó?

Cấu hình OPcache cho WordPress - tối ưu PHP bytecode cache giảm 40% TTFB
Cấu hình OPcache cho WordPress – tối ưu PHP bytecode cache giảm 40% TTFB

OPcache (Opcode Cache) là extension built-in của PHP, lưu trữ bytecode đã compile vào shared memory. Khi WordPress nhận request, thay vì đọc file PHP, parse, compile thành opcode rồi execute, PHP chỉ cần lấy opcode từ memory và chạy luôn. Bỏ qua 3 bước nặng nhất.

WordPress core có khoảng 400-600 file PHP load trên mỗi request, cộng thêm plugin và theme có thể lên 1000+ file. Không có OPcache, server compile lại toàn bộ 1000+ file đó trên mỗi request. Với OPcache, compile một lần, serve từ memory.

Cách Kiểm Tra OPcache Đang Bật Hay Tắt

Trước khi cấu hình, cần biết trạng thái hiện tại. Cách nhanh nhất là tạo file phpinfo():

# Tạo file tạm trên server
echo '<?php phpinfo();' | sudo tee /var/www/thienlv.com/public_html/phpinfo.php
sudo chown www-data:www-data /var/www/thienlv.com/public_html/phpinfo.php

Truy cập https://yoursite.com/phpinfo.php và tìm section “Zend OPcache”. Nếu không thấy section này, OPcache chưa được bật.

Nhanh hơn nữa, dùng WP-CLI:

php -r "if (extension_loaded('Zend OPcache')) { echo 'OPcache: ENABLED\n'; var_dump(opcache_get_status(false)); } else { echo 'OPcache: DISABLED\n'; }"

Hoặc kiểm tra qua command line:

php -i | grep "opcache.enable"
php -i | grep "opcache.memory"
php -i | grep "opcache.revalidate"

Quan trọng: Xóa file phpinfo.php ngay sau khi kiểm tra xong, nó lộ thông tin server:

rm /var/www/thienlv.com/public_html/phpinfo.php

Cấu Hình OPcache Tối Ưu Cho WordPress

Mặc định OPcache bật với giá trị thấp, không đủ cho WordPress với 10-20 plugin. Dưới đây là cấu hình mình dùng cho hầu hết site WordPress trên VPS 2-4GB RAM.

Tìm file php.ini của bạn:

# PHP 8.x trên Debian/Ubuntu
sudo nano /etc/php/8.x/fpm/php.ini

# PHP 8.x CLI
sudo nano /etc/php/8.x/cli/php.ini

# Kiểm tra PHP version
php -v

Thêm hoặc sửa các dòng sau trong section [opcache]:

[opcache]
; Bật OPcache
opcache.enable=1
opcache.enable_cli=1

; Memory - 256MB cho WordPress, đủ cho core + 20 plugin
opcache.memory_consumption=256

; Max files - WordPress core ~600 file, plugin có thể thêm 1000+
opcache.max_accelerated_files=20000

; Revalidate - production nên tắt (0), dev bật (1)
opcache.validate_timestamps=0

; Revalidate freq (giây) - nếu validate_timestamps=1
opcache.revalidate_freq=60

; Interned strings - WordPress dùng nhiều string constants
opcache.interned_strings_buffer=24

; Fast shutdown giúp giảm latency
opcache.fast_shutdown=1

; Save comments - WordPress cần annotations
opcache.save_comments=1

; JIT - PHP 8.x, tăng tốc thêm 10-20%
opcache.jit=tracing
opcache.jit_buffer_size=128M

Giải Thích Từng Thông Số Cho Người Mới

opcache.memory_consumption=256: Đây là dung lượng RAM dành riêng cho OPcache lưu bytecode. WordPress core + theme + 15-20 plugin thường dùng 80-150MB. Đặt 256MB là an toàn, có dư cho tương lai. Nếu VPS chỉ có 1GB RAM, giảm xuống 128MB.

opcache.max_accelerated_files=20000: Số lượng file tối đa OPcache lưu. WordPress core khoảng 600 file. Mỗi plugin thêm 20-100 file. 20 plugin = thêm 2000 file. Đặt 20000 là dư sức. Giá trị này phải là số nguyên, PHP sẽ làm tròn lên số nguyên tố gần nhất.

opcache.validate_timestamps=0: Đây là setting quan trọng nhất cho production. Khi =0, OPcache không bao giờ tự kiểm tra file PHP có thay đổi không. Nó cứ serve từ memory cho đến khi bạn chủ động clear cache. Điều này có nghĩa: sau khi sửa code hoặc update plugin, bạn phải restart PHP-FPM hoặc clear OPcache thủ công.

Nếu đặt =1, PHP sẽ kiểm tra file mỗi revalidate_freq giây. Trên production, việc này tốn thêm I/O không cần thiết.

opcache.jit=tracing: JIT (Just-In-Time) compilation là tính năng từ PHP 8.0+, compile hot paths thành machine code native. Chế度 tracing tối ưu hơn function cho WordPress vì nó phân tích runtime behavior. Benchmark cho thấy WordPress giảm thêm 10-20% TTFB với JIT tracing.

Cách Clear OPcache Sau Khi Update WordPress

validate_timestamps=0, sau khi update WordPress core, plugin, hoặc theme, bạn cần clear OPcache để PHP load code mới:

# Method 1: Restart PHP-FPM (khuyên dùng)
sudo systemctl restart php8.3-fpm

# Method 2: Clear qua OPcache API
php -r "opcache_reset();"

# Method 3: Tạo script clear-opcache.php
echo '<?php opcache_reset(); echo "OPcache cleared";' | \
  sudo tee /var/www/thienlv.com/public_html/clear-opcache.php
# Truy cập: https://yoursite.com/clear-opcache.php
# Sau đó xóa file!
rm /var/www/thienlv.com/public_html/clear-opcache.php

Mình thường tạo alias cho nhanh:

# Thêm vào ~/.bashrc
alias clearopcache='sudo systemctl restart php8.3-fpm && echo "OPcache + PHP-FPM restarted"'

# Reload bashrc
source ~/.bashrc

# Giờ chỉ cần gõ
clearopcache

Tự Động Clear OPcache Khi Update Plugin

WordPress update plugin qua admin không tự clear OPcache. Bạn có thể thêm hook tự động:

// Thêm vào functions.php của child theme
add_action('upgrader_process_complete', function($upgrader, $options) {
    if (function_exists('opcache_reset')) {
        opcache_reset();
    }
}, 10, 2);

// Clear khi activate/deactivate plugin
add_action('activated_plugin', function() {
    if (function_exists('opcache_reset')) {
        opcache_reset();
    }
});

add_action('deactivated_plugin', function() {
    if (function_exists('opcache_reset')) {
        opcache_reset();
    }
});

Lưu ý: opcache_reset() qua PHP-FPM worker chỉ clear cache của worker đó. Với validate_timestamps=0, cách chắc nhất vẫn là restart PHP-FPM qua SSH.

Verify OPcache Đang Hoạt Động Hiệu Qua

Sau khi cấu hình, restart PHP-FPM và kiểm tra:

# Restart PHP-FPM
sudo systemctl restart php8.3-fpm

# Kiểm tra OPcache status
php -r '
$s = opcache_get_status(false);
echo "Enabled: " . ($s["opcache_enabled"] ? "YES" : "NO") . "\n";
echo "Memory used: " . round($s["memory_usage"]["used_memory"] / 1024 / 1024, 1) . "MB / " . round($s["memory_usage"]["free_memory"] / 1024 / 1024 + $s["memory_usage"]["used_memory"] / 1024 / 1024, 1) . "MB\n";
echo "Files cached: " . $s["opcache_statistics"]["num_cached_scripts"] . "\n";
echo "Hit rate: " . round($s["opcache_statistics"]["opcache_hit_rate"] * 100, 1) . "%\n";
'

Kết quả mong đợi sau khi site chạy 24h:

Enabled: YES
Memory used: 145.2MB / 256MB
Files cached: 1847
Hit rate: 99.4%

Hit rate là metric quan trọng nhất. Nếu dưới 95%, có thể max_accelerated_files quá thấp, OPcache phải evict file cũ để chứa file mới. Tăng giá trị này lên.

Cài opcache-gui để monitor trực quan:

# Download opcache-gui
cd /tmp
wget https://raw.githubusercontent.com/amnuts/opcache-gui/main/index.php -O opcache-gui.php

# Copy vào site (chỉ dùng tạm, xóa sau)
sudo cp opcache-gui.php /var/www/thienlv.com/public_html/opcache-gui.php
sudo chown www-data:www-data /var/www/thienlv.com/public_html/opcache-gui.php

# Truy cập: https://yoursite.com/opcache-gui.php
# XEM XONG XÓA NGAY!
sudo rm /var/www/thienlv.com/public_html/opcache-gui.php

Benchmark: Trước Và Sau OPcache Tuning

Mình test trên VPS 2 vCPU, 4GB RAM, PHP 8.3, WordPress 7.0.2 với 12 plugin active. Dùng ab (Apache Benchmark) 100 requests, 10 concurrent:

Trước (OPcache off):

Requests per second:    3.42 [#/sec]
Time per request:       292.4 ms
TTFB (median):          285ms

Sau (OPcache on, tuned):

Requests per second:    8.71 [#/sec]  (+155%)
Time per request:       114.8 ms       (-61%)
TTFB (median):          108ms          (-62%)

Kết quả rõ ràng: TTFB giảm từ 285ms xuống 108ms, throughput tăng 155%. Đây là improvement lớn nhất bạn có thể đạt được mà không cần đổi hosting hay thêm cache layer.

Trên site thực tế với page cache (Nginx FastCGI Cache), OPcache ít impact hơn vì phần lớn request được serve từ static HTML. Nhưng với các request không cache được (admin, AJAX, WooCommerce cart, logged-in user), OPcache vẫn tiết kiệm 60% thời gian xử lý.

Các Lỗi Thường Gặp Khi Cấu Hình OPcache

1. “White screen” sau khi update plugin: Nguyên nhân: validate_timestamps=0 nhưng chưa clear OPcache. Fix: restart PHP-FPM.

sudo systemctl restart php8.3-fpm

2. Hit rate thấp (dưới 90%): max_accelerated_files quá thấp. Kiểm tra số file thực tế:

find /var/www/thienlv.com/public_html -name "*.php" | wc -l

Nếu trên 10000 file, tăng max_accelerated_files lên 30000 hoặc 40000.

3. Memory đầy: Nếu used_memory gần bằng memory_consumption, tăng lên 384MB hoặc 512MB. WordPress lớn với WooCommerce + nhiều plugin có thể cần 512MB.

4. JIT không hoạt động: Kiểm tra php -i | grep opcache.jit. Nếu trống, PHP build không có JIT support. Thường gặp trên PHP compile từ source thiếu --enable-opcache-jit.

Kết Hợp OPcache Với Các Cache Layer Khác

OPcache là layer đầu tiên trong stack cache WordPress. Thứ tự request đi qua:

Visitor → CDN (Cloudflare) → Nginx FastCGI Cache 
  → PHP-FPM + OPcache → Redis Object Cache → MySQL

Nếu request được serve ở CDN hoặc Nginx cache, PHP và OPcache không cần làm gì. Nhưng với dynamic request (logged-in user, WooCommerce checkout, form submit), OPcache là yếu tố quyết định tốc độ.

Mình đã viết chi tiết về từng layer trong series tối ưu WordPress. Nếu bạn chưa đọc, bắt đầu từ bài tổng quan tối ưu tốc độ WordPress 2026, rồi đến Redis Object CacheNginx FastCGI Cache.

Tóm Lại: 3 Bước Cần Làm Ngay

Bước 1: Kiểm tra OPcache đang bật hay tắt bằng php -i | grep opcache.enable.

Bước 2: Nếu chưa cấu hình, copy phần config mình cung cấp ở trên vào php.ini, chỉnh lại PHP version cho đúng server của bạn.

Bước 3: Restart PHP-FPM, chạy 24h, rồi kiểm tra hit rate. Mục tiêu: trên 99%. Nếu thấp hơn, tăng max_accelerated_filesmemory_consumption.

OPcache là foundation của PHP performance. Bỏ qua nó mà cài 10 plugin cache thì cũng như xây nhà không móng. Một lần cấu hình đúng, nó chạy im lìm năm không cần đụng tới.

Thanh Tùng

Mình là Thanh Tùng. Bạn bè gọi mình là "bác sĩ máy tính" vì hễ máy nào có vấn đề là mình muốn mò vào xem sao. Mình viết hướng dẫn theo cách mà mình mong người khác đã viết cho mình ngày xưa — từng bước rõ ràng, không bỏ sót, và nói luôn cái gì hay bị lỗi. Ngoài giờ làm mình chơi guitar, nuôi mèo, và có một con VPS riêng dành riêng cho việc cài thử đủ thứ linh tinh.

Xem tất cả bài viết →

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *