PHP Academy · Pelajaran

Penyusunan OPcache dan JIT

Percepatkan PHP dengan cache bytecode dan JIT.

Pelajaran 3 daripada 413 langkah

Penyusunan OPcache dan JIT ialah pelajaran PHP Academy percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran PHP Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus PHP Academy merangkumi sejumlah 4 pelajaran.

Menyimpan Kompilasi dalam Cache

OPcache menyimpan kod operasi yang dikompil dalam memori dikongsi supaya PHP melangkau analisis leksikal, penghuraian dan kompilasi pada setiap permintaan. Selain itu, JIT (sejak PHP 8.0) mengkompil kod operasi panas menjadi kod mesin natif. Bersama-sama, kedua-duanya menjadi tunjang prestasi PHP.

Pelajaran ini merangkumi konfigurasi OPcache, prapemuatan dan pelarasan JIT.

Fungsi OPcache

op_array yang dikompil bagi setiap fail dicache dalam segmen memori dikongsi yang digunakan oleh semua pekerja FPM. Permintaan yang menemui cache menggunakan semula kod operasi secara langsung. OPcache juga menjalankan pengoptimum (penggubahan pemalar, penghapusan kod mati dan penggabungan kod operasi) ketika kali pertama fail dikompil.

; 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 scripts

Pengesahan Cap Masa

validate_timestamps menentukan sama ada OPcache memeriksa semula cap masa pengubahsuaian fail. Dalam pembangunan, biarkan ia dihidupkan dengan revalidate_freq yang singkat; dalam produksi, tetapkan kepada 0 supaya PHP tidak memeriksa maklumat fail, dan lakukan pelancaran dengan mengosongkan cache (atau membina semula imej).

; Production: never re-stat files
opcache.validate_timestamps = 0

; Development: check every 2 seconds
; opcache.validate_timestamps = 1
; opcache.revalidate_freq = 2

Memeriksa Cache

opcache_get_status() melaporkan kadar capaian, penggunaan memori dan skrip yang dicache; opcache_get_configuration() memaparkan tetapan. Nisbah capaian yang rendah atau permulaan semula yang kerap bermakna memori terlalu sedikit atau terlalu banyak fail.

<?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";
}
?>

Prapemuatan

Prapemuatan (PHP 7.4+) mengkompil satu set kelas/fungsi sekali ketika pelayan dimulakan dan mengekalkannya dalam memori secara kekal, tersedia untuk setiap permintaan tanpa pemuatan automatik atau pemautan bagi setiap permintaan. Halakan opcache.preload kepada skrip yang memerlukan fail untuk memanaskan cache.

; php.ini
opcache.preload = /app/preload.php
opcache.preload_user = www-data

Menulis Skrip Prapemuatan

Skrip prapemuatan berjalan dalam proses induk. Gunakan opcache_compile_file() untuk memuatkan kelas tanpa melaksanakannya, atau gunakan require sahaja. Rangka kerja menjana senarai prapemuatan; berikut ialah bentuk salah satu daripadanya.

<?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());
    }
}
?>

Memperkenalkan JIT

Walaupun kod operasi dicache, VM masih mentafsirkannya. JIT mengkompil urutan kod operasi panas menjadi arahan CPU natif, lalu menghapuskan overhed penghantaran VM. Peningkatannya besar untuk kod berangka yang terikat CPU, tetapi sederhana untuk aplikasi web biasa yang terikat I/O (yang menghabiskan masa dalam pangkalan data/rangkaian, bukan CPU).

Mengkonfigurasi JIT

JIT berada dalam OPcache, jadi OPcache mesti dihidupkan. opcache.jit_buffer_size memperuntukkan ruang untuk kod mesin yang dijana (0 mematikan JIT). opcache.jit ialah mod empat digit yang mengawal pencetus dan strategi pengoptimuman.

; 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 level

JIT Jejak berbanding JIT Fungsi

Terdapat dua strategi: JIT fungsi (mod 1205) mengkompil seluruh fungsi pada panggilan pertama; JIT penjejakan (1254, alias tracing lalai) memprofilkan pelaksanaan dan mengkompil gelung/laluan panas, yang sering memberikan hasil lebih baik kerana ia dikhususkan berdasarkan jenis yang diperhatikan. Penjejakan ialah lalai yang disyorkan.

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

Mengukur Kesan JIT

JIT paling menyerlah dalam gelung berangka yang ketat. Penanda aras kendiri ini (gelung dalaman seakan-akan Mandelbrot) ialah jenis beban kerja terikat CPU yang boleh mengurangkan masa berjalan dengan ketara menggunakan JIT; jalankannya dengan dan tanpa jit_buffer_size untuk membuat perbandingan.

<?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);
?>

Bila TIDAK Perlu Menjangkakan Peningkatan

Dalam permintaan biasa yang membuat pertanyaan kepada pangkalan data, memaparkan templat dan mengembalikan JSON, CPU melakukan sedikit pengiraan mentah — JIT mungkin memberikan peningkatan peratus satu digit atau tiada peningkatan langsung. Utamakan OPcache + prapemuatan + penggunaan pangkalan data/cache yang baik terlebih dahulu. Simpan pelarasan JIT untuk pemprosesan imej, matematik, penghurai dan kod intensif pengiraan yang lain.

Semakan Pantas

Apakah kelebihan prapemuatan yang tidak diberikan oleh pencachean OPcache biasa?

Ringkasan

OPcache mencache op_array yang dikompil dalam memori dikongsi dan menjalankan pengoptimum; tetapkan validate_timestamps=0 dalam produksi dan tetapkan saiz memory_consumption/max_accelerated_files dengan betul. Prapemuatan mengekalkan kelas yang dipilih dalam memori ketika permulaan. JIT (dalam OPcache, memerlukan jit_buffer_size) mengkompil kod panas menjadi arahan natif — peningkatan besar untuk matematik terikat CPU, tetapi kecil untuk aplikasi web terikat I/O. Gunakan opcache_get_status() untuk mengesahkannya.

Percuma untuk bermula

Pelajari PHP dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
49
Pelajaran
195

Soalan Lazim

Adakah pelajaran “Penyusunan OPcache dan JIT” percuma?

Ya — teks penuh “Penyusunan OPcache dan JIT” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus PHP Academy, tingkat taraf kepada CoddyKit PRO. Kursus PHP Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Penyusunan OPcache dan JIT”?

Percepatkan PHP dengan cache bytecode dan JIT. Anda berlatih PHP Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan PHP Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran PHP Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.

Berapa lamakah pelajaran “Penyusunan OPcache dan JIT” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran PHP Academy ini?

Ya. Setiap pelajaran PHP Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Cara Zend Engine Berfungsi
  2. Pengurusan Memori dan Pengumpulan Sampah
  3. Penyusunan OPcache dan JIT
  4. Menulis Sambungan PHP Asas dalam C
← Kembali ke PHP Academy