0Pricing
PHP Academy · Ders

OPcache ve JIT Derlemesi

Bayt kodu önbelleğe alma ve JIT ile PHP'yi hızlandırın.

OPcache ve JIT Derlemesi, CoddyKit'te ücretsiz bir PHP Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, PHP Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. PHP Academy kursu toplamda 4 dersten oluşur.

Derlemeyi Önbelleğe Alma

OPcache, derlenmiş iş kodlarını paylaşılan bellekte saklar; böylece PHP her istekte sözcüksel çözümleme, ayrıştırma ve derleme işlemlerini atlar. Bunun üzerine JIT (PHP 8.0'dan beri) sıcak iş kodlarını yerel makine koduna derler. Birlikte PHP performansının temelini oluştururlar.

Bu derste OPcache'i yapılandırmayı, önceden yüklemeyi ve JIT'i ayarlamayı ele alacaksınız.

OPcache Ne Yapar

Her dosya için derlenmiş op_array, tüm FPM işçileri tarafından kullanılan bir paylaşılan bellek bölümünde önbelleğe alınır. Önbellek isabeti alan bir istek, iş kodlarını doğrudan yeniden kullanır. OPcache ayrıca bir dosyayı ilk kez derlediğinde bir iyileştirici çalıştırır (sabit katlama, ölü kodun kaldırılması, iş kodlarının birleştirilmesi).

; 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

Zaman Damgası Doğrulaması

validate_timestamps, OPcache'in dosyaların değiştirilme zamanlarını yeniden kontrol edip etmeyeceğini belirler. Geliştirme ortamında bu ayarı açık tutun ve kısa bir revalidate_freq kullanın; üretimde 0 olarak ayarlayarak PHP'nin dosyalar için hiçbir zaman stat bilgisi almamasını sağlayın ve dağıtımı önbelleği temizleyerek (veya kalıbı yeniden oluşturarak) yapın.

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

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

Önbelleği İnceleme

opcache_get_status() isabet oranını, bellek kullanımını ve önbelleğe alınan betikleri raporlar; opcache_get_configuration() ise ayarları gösterir. Düşük isabet oranı veya sık yeniden başlatma, belleğin yetersiz ya da dosya sayısının fazla olduğu anlamına gelir.

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

Önceden Yükleme

Önceden yükleme (PHP 7.4 ve sonrası), bir dizi sınıfı/işlevi sunucu başlatılırken bir kez derler ve bunları bellekte kalıcı olarak tutar. Böylece her istekte otomatik yükleme veya bağlantı kurma gerekmeden tüm isteklere sunulurlar. Önbelleği ısıtacak dosyaları yükleyen bir betiği opcache.preload ayarına gösterin.

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

Önceden Yükleme Betiği Yazma

Önceden yükleme betiği ana süreçte çalışır. Sınıfları çalıştırmadan yüklemek için opcache_compile_file() kullanın veya bunları doğrudan yükleyin. Çatılar bir önceden yükleme listesi oluşturur; böyle bir listenin biçimi şöyledir.

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

JIT Devreye Giriyor

İş kodları önbelleğe alınmış olsa bile VM bunları hâlâ yorumlar. JIT, sıcak iş kodu dizilerini yerel CPU yönergelerine derleyerek VM dağıtım ek yükünü ortadan kaldırır. Kazanç, CPU ağırlıklı sayısal kodlarda büyüktür; tipik G/Ç ağırlıklı web uygulamalarında ise daha sınırlıdır, çünkü bu uygulamalar zamanı CPU'da değil veritabanı ve ağ işlemlerinde harcar.

JIT'i Yapılandırma

JIT, OPcache'in içinde çalışır; bu nedenle OPcache açık olmalıdır. opcache.jit_buffer_size, üretilen makine kodu için alan ayırır (0, JIT'i devre dışı bırakır). opcache.jit, tetikleme ve iyileştirme stratejisini denetleyen dört basamaklı bir moddur.

; 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

İzlemeli JIT ve Fonksiyon JIT'i

İki strateji vardır: fonksiyon JIT'i (mod 1205), ilk çağrıda işlevlerin tamamını derler; izlemeli JIT (1254, varsayılan tracing takma adı), yürütmeyi profiller ve sıcak döngüleri/yolları derler. Gözlemlenen türlere göre özelleştiği için çoğu zaman daha iyi sonuç verir. İzlemeli yöntem önerilen varsayılandır.

; 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

JIT Etkisini Ölçme

JIT, sıkı sayısal döngülerde en iyi sonucu verir. Bu kendi başına çalışan kıyaslama (Mandelbrot benzeri bir iç döngü), JIT'in çalışma süresini önemli ölçüde azaltabileceği CPU ağırlıklı iş yükü türündedir; karşılaştırma yapmak için bunu jit_buffer_size ile ve bu ayar olmadan çalıştırın.

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

Kazanç Beklememeniz Gereken Durumlar (NOT)

Veritabanını sorgulayan, bir şablonu işleyen ve JSON döndüren tipik bir istekte CPU ham aritmetik işlemleri çok az yapar; JIT tek haneli yüzdelik bir kazanç sağlayabilir veya hiç kazanç sağlamayabilir. Önce OPcache'i, önceden yüklemeyi ve iyi veritabanı/önbellek kullanımını önceliklendirin. JIT ayarlarını görüntü işleme, matematik, ayrıştırıcılar ve diğer yoğun hesaplama yapan kodlar için saklayın.

Hızlı Kontrol

Önceden yükleme, sıradan OPcache önbelleğe almasının sağlayamadığı neyi sağlar?

Özet

OPcache, derlenmiş iş kodu dizilerini paylaşılan bellekte önbelleğe alır ve bir iyileştirici çalıştırır; üretimde validate_timestamps=0 ayarlayın ve memory_consumption/max_accelerated_files değerlerini uygun boyutlandırın. Önceden yükleme, seçilen sınıfları başlangıçta bellekte tutar. JIT (OPcache'in içindedir ve jit_buffer_size gerektirir), sıcak kodu yerel yönergelere derler; CPU ağırlıklı matematikte büyük kazançlar, G/Ç ağırlıklı web uygulamalarında ise küçük kazançlar sağlar. Doğrulamak için opcache_get_status() kullanın.

Sıkça Sorulan Sorular

“OPcache ve JIT Derlemesi” dersi ücretsiz mi?

Evet — “OPcache ve JIT Derlemesi” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve PHP Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. PHP Academy kursu toplamda 4 dersten oluşur.

“OPcache ve JIT Derlemesi” dersinde ne öğreneceğim?

Bayt kodu önbelleğe alma ve JIT ile PHP'yi hızlandırın. PHP Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

PHP Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te PHP Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.

“OPcache ve JIT Derlemesi” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu PHP Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her PHP Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Zend Engine Nasıl Çalışır
  2. Bellek Yönetimi ve Çöp Toplama
  3. OPcache ve JIT Derlemesi
  4. C ile Temel PHP Uzantısı Yazma
← PHP Academy Sayfasına Dön