Zend OPcache: Konsep, Instalasi, dan Pengaturan, Nilai php.ini, serta Menonaktifkan JIT
Zend OPcache adalah ekstensi PHP yang mengompilasi skrip PHP menjadi bytecode dan menyimpannya di memori bersama, sehingga langkah kompilasi dilewati saat berkas yang sama dijalankan lagi. Ketika JIT diaktifkan di server WordPress dengan PHP 8.3 dan semua halaman menampilkan error 500, server dipulihkan dengan membiarkan OPcache seperti semula dan hanya menonaktifkan JIT.
Sejak PHP 5.5, OPcache sudah disertakan di dalam PHP secara bawaan.
1️⃣ Konsep Zend OPcache: caching bytecode
Setiap kali ada permintaan, skrip PHP melewati tiga tahap: membaca berkas, mengompilasi menjadi bytecode, dan menjalankan. Saat OPcache aktif, mulai permintaan kedua untuk berkas yang sama, dua tahap pertama hilang dan hanya eksekusi yang tersisa.
Memori bersama tempat OPcache menyimpan bytecode dipakai bersama oleh semua worker PHP-FPM. Jika ada beberapa situs yang terhubung ke PHP-FPM yang sama, skrip situs-situs itu juga disimpan dalam satu memori bersama.
Yang disimpan OPcache adalah kode PHP hasil kompilasi, sehingga eksekusi PHP dan kueri database tetap terjadi setiap kali halaman dibuka. Melewati eksekusi PHP sepenuhnya dengan menyimpan HTML yang sudah jadi adalah tugas page cache.
2️⃣ Memeriksa instalasi PHP OPcache
Anda dapat memeriksa apakah OPcache terpasang pada baris terakhir keluaran [php -v].
php -vPHP 8.3.22 (cli) (built: Jun 3 2025 17:17:57) (NTS gcc x86_64)
Copyright (c) The PHP Group
Zend Engine v4.3.22, Copyright (c) Zend Technologies
with Zend OPcache v8.3.22, Copyright (c), by Zend TechnologiesJika baris terakhir itu tidak ada, pasang dengan dnf. Nama paketnya biasanya php-opcache; jika beberapa versi PHP dipasang bersamaan dari repositori Remi, nama paket diberi versi, seperti php83-php-opcache.
dnf -y install php-opcachePaket php-opcache dari repositori Remi memuat ekstensi melalui baris [zend_extension=opcache] di [/etc/php.d/10-opcache.ini]. Setelah dipasang, mulai ulang PHP-FPM agar OPcache juga berlaku untuk permintaan web.
3️⃣ Pengaturan OPcache: nilai php.ini
Pengaturan OPcache bisa berada di dua tempat: bagian [opcache] pada [/etc/php.ini] dan [/etc/php.d/10-opcache.ini].
php --iniConfiguration File (php.ini) Path: /etc
Loaded Configuration File: /etc/php.ini
Scan for additional .ini files in: /etc/php.d
Additional .ini files parsed: /etc/php.d/10-opcache.ini,Berkas di folder php.d dibaca setelah php.ini, sehingga jika entri yang sama ditulis di kedua tempat, nilai dari php.d yang berlaku.
Tabel di bawah menunjukkan nilai bawaan PHP 8.3 dan nilai yang diterapkan di server WordPress yang diperiksa.
| Item | Nilai bawaan PHP 8.3 | Nilai yang diterapkan | Arti |
|---|---|---|---|
| opcache.enable | 1 | 1 | Menggunakan OPcache |
| opcache.enable_cli | 0 | 1 | Dipakai juga oleh PHP baris perintah (wp-cli dan lainnya) |
| opcache.memory_consumption | 128 | 1024 | Memori bersama untuk menyimpan bytecode (MB) |
| opcache.interned_strings_buffer | 8 | 16 | Memori yang menyimpan string yang sama hanya satu kali (MB) |
| opcache.max_accelerated_files | 10000 | 10000 | Batas atas jumlah kunci yang dapat di-cache (batas sebenarnya adalah bilangan prima yang sama dengan atau lebih besar dari nilai ini: 16229 untuk 10000) |
| opcache.max_wasted_percentage | 5 | 10 | Jika memori kurang dan ruang yang terbuang melebihi persentase ini, cache dikosongkan lalu dimulai ulang |
| opcache.validate_timestamps | 1 | 1 | Memeriksa apakah berkas berubah |
| opcache.revalidate_freq | 2 | 60 | Selang waktu pemeriksaan perubahan berkas (detik) |
| opcache.jit | tracing | disable | Mode JIT (mulai PHP 8.4 nilai bawaannya disable) |
| opcache.jit_buffer_size | 0 | 0 | Memori JIT; jika 0, JIT tidak berjalan (mulai PHP 8.4 nilai bawaannya 64M) |
Nilai yang dimasukkan ke bagian [opcache] pada [/etc/php.ini] ada di bawah. Ukuran memori disesuaikan dengan memori server, dan [opcache.max_accelerated_files] disesuaikan dengan jumlah berkas WordPress.
[opcache]
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=1024
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000
opcache.max_wasted_percentage=10
opcache.validate_timestamps=1
opcache.revalidate_freq=60Jika baris [zend_extension] dimasukkan lagi ke php.ini, ekstensi dimuat dua kali dan peringatan [Cannot load Zend OPcache] ditampilkan.
Jika [opcache.revalidate_freq] bernilai 60, setelah berkas PHP diubah, kode lama masih bisa berjalan hingga 60 detik.
Pada server WordPress yang berkas PHP-nya sering berubah, biarkan [opcache.validate_timestamps] bernilai 1 agar perubahan berkas diperiksa. Nilai 0 yang disarankan dokumentasi Symfony untuk server produksi cocok untuk server yang berkas PHP-nya hanya berubah saat versi baru di-deploy.
Meskipun [opcache.validate_timestamps] bernilai 0, WordPress sendiri mengosongkan cache berkas yang berubah saat pembaruan dilakukan dari layar admin. Namun jika memperbarui dengan wp-cli atau mengubah berkas lewat SSH, kode lama tetap berjalan sampai PHP-FPM dimulai ulang.
4️⃣ Menonaktifkan JIT OPcache
JIT pada PHP 8 mempercepat pekerjaan yang banyak memakai CPU, sehingga efeknya kecil pada aplikasi seperti WordPress yang menangani permintaan web. Dalam pengukuran WordPress yang dimuat di RFC JIT PHP pun, pengujian dengan JIT aktif menangani 326 permintaan per detik dan tanpa JIT 315.
JIT diaktifkan di server WordPress dengan PHP 8.3.22 melalui [opcache.jit=tracing] dan [opcache.jit_buffer_size=128M]. Tiga hari kemudian, pada hari ketika lonjakan permintaan membuat worker PHP-FPM dimulai ulang beberapa kali, error 500 terjadi di semua halaman.
Di log error tercatat pesan [Allowed memory size of 1073741824 bytes exhausted]. Bagian [tried to allocate 4295229440 bytes] yang menyusul adalah catatan upaya mengalokasikan 4GB sekaligus pada batas memori PHP 1GB. Setelah JIT dinonaktifkan, permintaan yang sama diproses dengan normal.
JIT dinonaktifkan dengan memasukkan dua baris di bawah ke [/etc/php.d/10-opcache.ini]. Meskipun pengaturan JIT masih tersisa di [/etc/php.ini], nilai dari berkas ini yang berlaku.
opcache.jit=disable
opcache.jit_buffer_size=0Di PHP 8.3, nilai bawaan [opcache.jit_buffer_size] adalah 0, sehingga JIT tidak berjalan jika tidak diatur secara terpisah. Mulai PHP 8.4, nilai bawaan [opcache.jit] juga disable.
5️⃣ Menerapkan dan memeriksa pengaturan
Pengaturan yang diubah baru berlaku setelah PHP-FPM dimulai ulang.
systemctl restart php-fpmSetelah dimulai ulang, memori bersama OPcache dikosongkan dan dialokasikan lagi dengan pengaturan baru.
php -i | grep -E '^opcache\.(enable|memory_consumption|revalidate_freq|validate_timestamps|jit) 'opcache.enable => On => On
opcache.jit => disable => disable
opcache.memory_consumption => 1024 => 1024
opcache.revalidate_freq => 60 => 60
opcache.validate_timestamps => On => OnNilai yang ditampilkan [php -i] adalah pengaturan PHP baris perintah. Pada keluarga RHEL, PHP-FPM membaca berkas [/etc/php.ini] dan [/etc/php.d] yang sama, sehingga nilainya sama.
Jika [opcache_get_status()] dipanggil di baris perintah, jumlah skrip yang di-cache adalah 0. PHP baris perintah membuat memori bersama baru setiap kali dijalankan, sehingga penggunaan PHP-FPM diperiksa dengan menaruh berkas di bawah pada folder dokumen web lalu membukanya di browser.
<?php
header('Content-Type: text/plain');
$s = opcache_get_status(false);
print_r($s['memory_usage']);
print_r($s['opcache_statistics']);
print_r($s['interned_strings_usage']);
var_dump($s['cache_full']);Jika [cache_full] bernilai true, memori bersama atau kunci sudah penuh. Setelah diperiksa, hapus berkas ini segera.
Pada server tempat tiga situs WordPress memakai PHP-FPM yang sama, 317MB dari 1024MB memori bersama terpakai. Skrip yang di-cache berjumlah 3.366 sampai 4.222 per situs, total 11.358.
OPcache menyimpan skrip dengan path sebenarnya, dan untuk berkas yang dimuat lewat path relatif ia membuat satu kunci lagi dengan direktori kerja ditambahkan, sehingga jumlah kunci lebih banyak daripada jumlah skrip. Dengan 11.358 skrip, kunci memenuhi batas 16.229, dan buffer string 16MB juga tidak punya ruang kosong lagi.
Jika kunci penuh, skrip baru tidak di-cache dan dikompilasi pada setiap permintaan. Dalam 5 menit 21 detik, cache miss naik dari 18.408 menjadi 36.027, tetapi jumlah skrip yang di-cache tetap 11.358.
Pada server yang menjalankan beberapa WordPress atau banyak plugin, atur [opcache.max_accelerated_files] dengan lebih longgar agar batas kunci tidak penuh. Jika diatur 20000, batas kunci sebenarnya menjadi 32.531. Jika buffer string penuh, tambah juga [opcache.interned_strings_buffer].
🔢 FAQ & Konten yang Direkomendasikan
Cache
Cache: Definisi dan Semua Bidang yang Menggunakan Caching
Artikel yang membagi bidang penggunaan cache, termasuk OPcache yang menyimpan kode PHP hasil kompilasi dan page cache yang menyimpan HTML yang sudah jadi.
PHP-FPM
Peringatan php-fpm max_children: Cari Penyebabnya di Log Sebelum Menambah Worker
Artikel tentang cara menentukan lewat log penyebab peringatan yang muncul saat semua worker PHP-FPM yang berbagi memori bersama OPcache penuh terpakai.
PHP-FPM
Apa itu PHP-FPM | Instalasi dan konfigurasi PHP-FPM
Artikel tentang instalasi PHP-FPM, tempat OPcache bekerja di dalamnya, pengaturan pool di www.conf, dan cara memulai ulangnya.
ℹ️ Pemberitahuan Afiliasi
Konten di situs ini berisi tautan afiliasi. Jika pengunjung membeli produk atau layanan melalui tautan tersebut, situs ini menerima komisi dari penjual. Harga yang dibayar pembeli(turun saat ada diskon promo ↓), tidak naik karena hal ini. Harga, diskon, dan informasi stok yang ditampilkan berlaku pada saat penulisan dan bisa berbeda dengan kondisi sebenarnya, jadi pastikan kembali di situs penjual sebelum membeli. Pemilihan dan penilaian produk dibuat berdasarkan standar kami sendiri, dan ada tidaknya komisi tidak memengaruhi urutan maupun isi penilaian.