OPcache dan Kompilasi JIT
Percepat PHP dengan penyimpanan bytecode dalam cache dan JIT.
OPcache dan Kompilasi JIT adalah pelajaran PHP Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar PHP Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus PHP Academy mencakup 4 pelajaran total.
Menyimpan Hasil Kompilasi
OPcache menyimpan kode operasi terkompilasi di memori bersama, sehingga PHP tidak perlu melakukan analisis leksikal, penguraian, dan kompilasi pada setiap permintaan. Selain itu, JIT (sejak PHP 8.0) mengompilasi kode operasi yang sering dijalankan menjadi kode mesin native. Keduanya merupakan fondasi performa PHP.
Pelajaran ini membahas konfigurasi OPcache, pemuatan awal, dan penyetelan JIT.
Fungsi OPcache
op_array terkompilasi untuk setiap berkas disimpan dalam segmen memori bersama yang digunakan semua pekerja FPM. Permintaan yang menemukan data di cache dapat langsung menggunakan kode operasi tersebut. OPcache juga menjalankan pengoptimal (pelipatan konstanta, eliminasi kode mati, penggabungan kode operasi) saat pertama kali mengompilasi berkas.
; Core OPcache config (php.ini)
opcache.enable = 1
opcache.memory_consumption = 256 ; MB of shared memory
opcache.interned_strings_buffer = 16 ; MB for interned strings
opcache.max_accelerated_files = 20000 ; cap on cached scriptsValidasi Cap Waktu
validate_timestamps menentukan apakah OPcache memeriksa ulang waktu modifikasi berkas. Dalam pengembangan, biarkan tetap aktif dengan revalidate_freq yang singkat; dalam produksi, atur ke 0 agar PHP tidak pernah memeriksa berkas, lalu lakukan penerapan dengan menghapus cache (atau membangun ulang citra).
; Production: never re-stat files
opcache.validate_timestamps = 0
; Development: check every 2 seconds
; opcache.validate_timestamps = 1
; opcache.revalidate_freq = 2Memeriksa Cache
opcache_get_status() melaporkan rasio keberhasilan cache, penggunaan memori, dan skrip yang tersimpan; opcache_get_configuration() menampilkan pengaturan. Rasio keberhasilan yang rendah atau mulai ulang yang sering berarti memori terlalu sedikit atau jumlah berkas terlalu banyak.
<?php
if (function_exists('opcache_get_status')) {
$s = opcache_get_status(false);
if ($s) {
printf("hits: %d\n", $s['opcache_statistics']['hits']);
printf("misses: %d\n", $s['opcache_statistics']['misses']);
printf("hit %%: %.2f\n", $s['opcache_statistics']['opcache_hit_rate']);
printf("used: %.1f MB\n", $s['memory_usage']['used_memory'] / 1048576);
} else {
echo "OPcache enabled but no status (likely CLI)\n";
}
} else {
echo "OPcache not available\n";
}
?>Pemuatan Awal
Pemuatan awal (PHP 7.4+) mengompilasi sekumpulan kelas/fungsi sekali saat server dimulai dan menyimpannya secara permanen di memori, sehingga tersedia untuk setiap permintaan tanpa pemuatan otomatis atau penautan per permintaan. Arahkan opcache.preload ke skrip yang memuat berkas-berkas tersebut untuk mengisi cache.
; php.ini
opcache.preload = /app/preload.php
opcache.preload_user = www-dataMenulis Skrip Pemuatan Awal
Skrip pemuatan awal berjalan dalam proses induk. Gunakan opcache_compile_file() untuk memuat kelas tanpa mengeksekusinya, atau cukup require kelas-kelas tersebut. Kerangka kerja membuat daftar pemuatan awal; berikut bentuk salah satunya.
<?php
// preload.php — runs once at startup
$dir = '/app/src';
$rii = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($dir)
);
foreach ($rii as $file) {
if ($file->getExtension() === 'php') {
// Compiles + links the class into shared memory
opcache_compile_file($file->getPathname());
}
}
?>Memasuki JIT
Meskipun kode operasi sudah tersimpan, VM tetap menafsirkannya. JIT mengompilasi rangkaian kode operasi yang sering dijalankan menjadi instruksi CPU native, sehingga menghilangkan biaya pemanggilan VM. Peningkatannya besar untuk kode numerik yang terikat CPU, tetapi sederhana untuk aplikasi web yang terikat masukan/keluaran (yang menghabiskan waktu di basis data/jaringan, bukan di CPU).
Mengonfigurasi JIT
JIT berada di dalam OPcache, jadi OPcache harus diaktifkan. opcache.jit_buffer_size mengalokasikan ruang untuk kode mesin yang dihasilkan (nilai 0 menonaktifkan JIT). opcache.jit adalah mode empat digit yang mengatur pemicu dan strategi pengoptimalan.
; Enable JIT (requires opcache.enable=1)
opcache.jit_buffer_size = 128M
opcache.jit = tracing ; alias for 1254, the common default
; The 4 digits CRTO mean:
; C - CPU optimization flags
; R - register allocation
; T - trigger (when to JIT)
; O - optimization levelJIT Penelusuran vs JIT Fungsi
Ada dua strategi: JIT fungsi (mode 1205) mengompilasi seluruh fungsi saat pemanggilan pertama; JIT penelusuran (1254, alias bawaan tracing) membuat profil eksekusi dan mengompilasi perulangan/jalur panas, yang sering memberikan hasil lebih baik karena mengkhususkan kode berdasarkan tipe yang diamati. JIT penelusuran adalah bawaan yang disarankan.
; Tracing JIT (recommended) — compiles hot traces
opcache.jit = tracing
; Function JIT — compiles entire functions when first called
; opcache.jit = function
; Disable JIT but keep opcode cache
; opcache.jit_buffer_size = 0Mengukur Dampak JIT
JIT sangat efektif pada perulangan numerik yang ketat. Tolok ukur mandiri ini (perulangan dalam yang mirip Mandelbrot) merupakan jenis beban kerja yang terikat CPU dan JIT dapat memangkas waktu berjalan secara signifikan; jalankan dengan dan tanpa jit_buffer_size untuk membandingkannya.
<?php
function mandelEscape(float $cr, float $ci, int $max): int {
$zr = 0.0; $zi = 0.0; $n = 0;
while ($n < $max && ($zr * $zr + $zi * $zi) <= 4.0) {
$t = $zr * $zr - $zi * $zi + $cr;
$zi = 2.0 * $zr * $zi + $ci;
$zr = $t;
$n++;
}
return $n;
}
$start = hrtime(true);
$sum = 0;
for ($y = 0; $y < 200; $y++) {
for ($x = 0; $x < 200; $x++) {
$sum += mandelEscape($x / 100 - 2, $y / 100 - 1, 256);
}
}
printf("sum=%d time=%.2f ms\n", $sum, (hrtime(true) - $start) / 1e6);
?>Kapan NOT Perlu Mengharapkan Peningkatan
Untuk permintaan umum yang menanyakan basis data, merender templat, dan mengembalikan JSON, CPU hanya melakukan sedikit aritmetika mentah — JIT mungkin memberikan peningkatan satu digit persen atau tidak memberikan peningkatan sama sekali. Prioritaskan OPcache + pemuatan awal + penggunaan basis data/cache yang baik terlebih dahulu. Simpan penyetelan JIT untuk pemrosesan gambar, matematika, pengurai, dan kode lain yang berat secara komputasi.
Pemeriksaan Singkat
Apa yang diberikan pemuatan awal yang tidak diberikan oleh penyimpanan cache OPcache biasa?
Ringkasan
OPcache menyimpan larik kode operasi terkompilasi di memori bersama dan menjalankan pengoptimal; atur validate_timestamps=0 di produksi dan tetapkan ukuran memory_consumption/max_accelerated_files dengan tepat. Pemuatan awal menjaga kelas-kelas yang dipilih tetap berada di memori sejak server dimulai. JIT (di dalam OPcache, memerlukan jit_buffer_size) mengompilasi kode panas menjadi instruksi native — peningkatan besar untuk matematika yang terikat CPU, tetapi kecil untuk aplikasi web yang terikat masukan/keluaran. Gunakan opcache_get_status() untuk memverifikasi.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “OPcache dan Kompilasi JIT” gratis?
Ya — teks lengkap “OPcache dan Kompilasi JIT” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus PHP Academy, upgrade ke CoddyKit PRO. Kursus PHP Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “OPcache dan Kompilasi JIT”?
Percepat PHP dengan penyimpanan bytecode dalam cache dan JIT. Kamu berlatih PHP Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai PHP Academy?
Tidak diperlukan pengalaman sebelumnya. PHP Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “OPcache dan Kompilasi JIT” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran PHP Academy ini?
Ya. Setiap pelajaran PHP Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Cara Kerja Zend Engine
- Manajemen Memori dan Pengumpulan Sampah
- OPcache dan Kompilasi JIT
- Menulis Ekstensi PHP Dasar dalam C