Zend OPcache: Konsep, Instalasi, dan Pengaturan, Nilai php.ini, serta Menonaktifkan JIT

Lingkungan uji Keluarga RHELAlmaLinux 9.8akun rootDiperiksa 2026-10-16

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.

🧩 Pemrosesan permintaan tanpa dan dengan OPcache
Diagram penjelasan
🧠 OPcache
📨 Permintaan
🧰 PHP-FPM Worker
Worker 1Permintaan pertama
Worker 2Permintaan kedua
Worker 3menunggu
Tiga tahap setiap permintaanPermintaan pertama · tiga tahapHanya menjalankan→
⚙️ Pemrosesan skrip PHP
Membaca berkasDilewati
→
Kompilasi bytecodeDilewati
→
JalankanMenjalankan PHP · kueri database
Memori bersama tidak dipakai↓ Bytecode disimpan↑ Bytecode dari memori bersama dipakai
🧠 Memori bersama
Bytecode (kode PHP hasil kompilasi)
Dipakai bersama oleh semua worker PHP-FPM · satu memori bersama meski situsnya banyak
Tanpa OPcache, skrip PHP melewati tiga tahap setiap kali ada permintaan: membaca berkas, mengompilasi menjadi bytecode, dan menjalankan.
Tanpa OPcache, permintaan kedua untuk berkas yang sama juga melewati lagi ketiga tahap itu: membaca berkas, mengompilasi menjadi bytecode, dan menjalankan.
Saat OPcache aktif, permintaan pertama melewati tiga tahap lalu menyimpan bytecode di memori bersama.
Mulai permintaan kedua untuk berkas yang sama, dua tahap pertama hilang dan hanya eksekusi yang tersisa; memori bersama dipakai bersama oleh semua worker PHP-FPM.

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 -v
PHP 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 Technologies

Jika 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-opcache

Paket 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 --ini
Configuration 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.

ItemNilai bawaan PHP 8.3Nilai yang diterapkanArti
opcache.enable11Menggunakan OPcache
opcache.enable_cli01Dipakai juga oleh PHP baris perintah (wp-cli dan lainnya)
opcache.memory_consumption1281024Memori bersama untuk menyimpan bytecode (MB)
opcache.interned_strings_buffer816Memori yang menyimpan string yang sama hanya satu kali (MB)
opcache.max_accelerated_files1000010000Batas 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_percentage510Jika memori kurang dan ruang yang terbuang melebihi persentase ini, cache dikosongkan lalu dimulai ulang
opcache.validate_timestamps11Memeriksa apakah berkas berubah
opcache.revalidate_freq260Selang waktu pemeriksaan perubahan berkas (detik)
opcache.jittracingdisableMode JIT (mulai PHP 8.4 nilai bawaannya disable)
opcache.jit_buffer_size00Memori 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=60

Jika 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=0

Di 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-fpm

Setelah 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 => On

Nilai 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

Pengaturan itu dihapus di PHP 7.2, sehingga di PHP 8 tidak berpengaruh pada cara kerja meskipun masih ada di php.ini. Jika server membawa pengaturan lama, baris ini boleh dihapus.

OPcache menyimpan kode PHP hasil kompilasi, sedangkan object cache Redis menyimpan hasil kueri database. Karena yang disimpan berbeda, keduanya dapat dipakai bersamaan.

Pada server yang menjalankan PHP lewat PHP-FPM, OPcache bekerja di dalam PHP-FPM, jadi yang dimulai ulang hanya PHP-FPM. Pada server yang menjalankan PHP sebagai modul Apache (mod_php), mulai ulang Apache.

ℹ️ 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.

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *

Buktikan bahwa Anda manusia: 8   +   10   =