0Pricing
PHP Academy · Ders

Zend Engine Nasıl Çalışır

PHP'yi kaynak koddan işlem kodlarına ve çalıştırmaya kadar izleyin.

Zend Engine Nasıl Çalışır, CoddyKit'te ücretsiz bir PHP Academy dersidir. Bu, 4 dersinin 1. 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.

Motorun İçinde

PHP, kaynak kodundan satır satır yorumlanmaz. Zend Engine, betiğinizi iş kodları adı verilen bir ara gösterime derler; ardından bir sanal makine bunları yürütür. Bu işlem hattını anlamak performansı, OPcache'i ve JIT'i açıklar.

Bu derste kaynak → belirteçler → AST → iş kodları → VM yürütmesi aşamalarını inceleyeceksiniz.

İşlem Hattı

Bir PHP dosyasına yönelik her istek dört aşamadan geçer:

  • Sözcüksel çözümleme — kaynak metin → belirteçler (re2c tabanlı tarayıcı)
  • Ayrıştırma — belirteçler → Soyut Sözdizimi Ağacı (Bison dilbilgisi)
  • Derleme — AST → iş kodu dizisi (op_array)
  • Yürütme — Zend VM iş kodları üzerinde ilerler

OPcache olmadan ilk üç aşama her istekte tekrarlanır.

Belirteçlere Ayırma

Sözcük çözümleyici, karakterleri T_VARIABLE, T_ECHO, T_STRING gibi belirteçlere dönüştürür. PHP bu aşamayı token_get_all() / PhpToken üzerinden sunar; PHP-CS-Fixer gibi araçların kullandığı aşama da tam olarak budur.

<?php
$src = '<?php $x = 1 + 2; echo $x;';

foreach (PhpToken::tokenize($src) as $tok) {
    if ($tok->isIgnorable()) continue;   // skip whitespace
    printf("%-12s %s\n", $tok->getTokenName(), trim($tok->text));
}
?>

AST

Belirteçler bir düğüm ağacına ayrıştırılır; örneğin alt düğümleri bir değişken ile ikili işlem ifadesi olan bir atama düğümü oluşturulur. PHP bu AST'yi kendi içinde oluşturur; nikic/php-parser ise PHPStan gibi statik çözümleme araçları için kullanıcı alanında eşdeğer bir AST yeniden oluşturur.

<?php
// Conceptual AST for:  $x = 1 + 2;
//
//   AST_ASSIGN
//   ├── AST_VAR  ($x)
//   └── AST_BINARY_OP (+)
//       ├── 1
//       └── 2
//
// At compile time PHP folds 1 + 2 into a literal 3
// (constant folding) before generating opcodes.
echo "AST drives opcode generation\n";
?>

İş Kodları

Derleyici bir iş kodu dizisi oluşturur: iş kodlarından oluşan düz bir liste. Her iş kodunun bir iş kodu numarası (ör. ZEND_ADD, ZEND_ECHO, ZEND_ASSIGN) ve en fazla iki işleneni ile bir sonucu bulunur; bunların her biri derlenmiş bir değişken (CV), geçici değer (TMP) veya sabit olabilir.

<?php
// Opcodes for:  $x = 1 + 2; echo $x;
//
// line  op            operands           result
//  ---  ------------  -----------------  -------
//   1   ADD           1, 2               ~0
//   1   ASSIGN        $x, ~0
//   1   ECHO          $x
//   1   RETURN        1
//
// ~0 is a temporary; $x is a compiled variable (CV).
echo "op_array is what OPcache stores\n";
?>

İş Kodlarını İnceleme

Üretilen iş kodlarını VLD eklentisiyle veya OPcache'in opcache.opt_debug_level ayarıyla dökebilirsiniz. Bu, sabit katlamayı, ölü kodun kaldırılmasını ve denetim akışının JMP/JMPZ iş kodlarına nasıl dönüştüğünü gösterir.

# Dump opcodes with VLD
php -d vld.active=1 -d vld.execute=0 script.php

# Or via OPcache optimizer debug (pre/post optimization)
php -d opcache.opt_debug_level=0x10000 script.php   # before opt
php -d opcache.opt_debug_level=0x20000 script.php   # after opt

Derlenmiş Değişkenler (CV)

Derlenmiş kodda yerel değişkenler karma tablo araması değildir; derleyici her birine numaralı bir CV yuvası atar. $x'e ikinci kez erişmek bir dizi dizini kullanmaktır; sembol tablosu araması değildir. Yerel değişkenlerin hızlı olmasının başlıca nedenlerinden biri budur.

<?php
// Each named local gets a fixed CV slot at compile time:
//   $a -> CV0   $b -> CV1   $sum -> CV2
function add(int $a, int $b): int {
    $sum = $a + $b;   // ADD CV0, CV1 -> CV2
    return $sum;      // RETURN CV2
}
echo add(2, 3) . PHP_EOL;
?>

VM Yürütme Döngüsü

Yürütücü (execute_ex), iş kodu dizisi üzerinde ilerler. Her iş kodu bir işleyici işlevle eşleşir; PHP bu dağıtımı dev bir seçim deyimi, hesaplanmış atlamalar veya karma bir yaklaşımla oluşturabilir. Karma yaklaşım varsayılandır ve destekleyen derleyicilerde en hızlı seçenektir. opline işaretçisi ilerler; JMP iş kodları denetim akışı için bu işaretçiyi değiştirir.

<?php
// if ($n > 0) echo 'pos'; compiles roughly to:
//
//   IS_SMALLER 0, $n  -> ~T
//   JMPZ ~T, ->L1        ; if false, skip
//   ECHO 'pos'
// L1:
//   RETURN 1
//
// The VM follows opline; JMPZ rewrites it conditionally.
$n = 5;
if ($n > 0) echo "pos\n";
?>

OPcache'in Yeri

OPcache, derlenmiş iş kodu dizisini paylaşılan bellekte önbelleğe alarak sonraki isteklerde sözcüksel çözümleme, ayrıştırma ve derleme aşamalarını atlar. Ayrıca bir iyileştirici aşaması çalıştırır (sabit katlama, ölü kodun kaldırılması, iş kodlarının birleştirilmesi). VM her istekte önbelleğe alınan iş kodlarını yine yürütür; JIT'in daha sonra yardımcı olduğu nokta budur.

Fonksiyon Çağrısı Ek Yükü

Çağrılar yeni bir VM yığın çerçevesi oluşturur: INIT_FCALL, her bağımsız değişken için SEND_VAL/SEND_VAR ve ardından DO_FCALL iş kodları çalışır. Bunu bilmek, aşırı sayıdaki küçük fonksiyon çağrısının neden ölçülebilir bir maliyet oluşturduğunu ve sıcak döngülerde satır içi yerleştirmenin/JIT'in neden önemli olduğunu açıklar.

<?php
// square($x) compiles to a call sequence:
//   INIT_FCALL 'square'
//   SEND_VAR   $x
//   DO_FCALL        -> ~R
//   ASSIGN $y, ~R
function square(int $x): int { return $x * $x; }

$total = 0;
for ($i = 1; $i <= 5; $i++) {
    $total += square($i);   // one call sequence per iteration
}
echo $total . PHP_EOL;     // 1+4+9+16+25 = 55
?>

İsteği Sonlandırma

Yürütmeden sonra PHP isteği sonlandırır: çalışan değişkenler serbest bırakılır, çıktı gönderilir, ardından motor bellek ayırıcı arenasını sıfırlar. Paylaşımsız FPM modelinde her istek temiz bir başlangıç yapar; bu nedenle bir istekteki ölümcül hata başka bir isteği bozamaz. OPcache'in paylaşılan iş kodu dizileri istekler arasında yaşamaya devam eder; yürütücü durumu ise etmez.

Hızlı Kontrol

OPcache, yeniden derlemeyi atlamak için tam olarak neyi saklar?

Özet

Zend işlem hattı sözcüksel çözümleme → ayrıştırma → derleme → yürütme aşamalarından oluşur. Kaynak kod belirteçlere, ardından bir AST'ye, sonra da VM'nin yürütme döngüsünün çalıştırdığı bir iş kodu dizisine dönüşür; yerel değişkenler numaralı CV yuvalarında tutulur ve çağrılar yığın çerçeveleri oluşturur. OPcache, iş kodu dizisini (bir iyileştirici aşamasıyla birlikte) önbelleğe alır; böylece her istekte yalnızca yürütme tekrarlanır.

Sıkça Sorulan Sorular

“Zend Engine Nasıl Çalışır” dersi ücretsiz mi?

Evet — “Zend Engine Nasıl Çalışır” 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.

“Zend Engine Nasıl Çalışır” dersinde ne öğreneceğim?

PHP'yi kaynak koddan işlem kodlarına ve çalıştırmaya kadar izleyin. 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 1. dersidir.

“Zend Engine Nasıl Çalışır” 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