0Pricing
PHP Academy · Pelajaran

Cara Kerja Zend Engine

Telusuri PHP dari kode sumber, opcode, hingga eksekusi.

Cara Kerja Zend Engine adalah pelajaran PHP Academy gratis di CoddyKit. Ini adalah pelajaran 1 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.

Di Dalam Mesin

PHP tidak ditafsirkan baris demi baris dari kode sumber. Zend Engine mengompilasi skrip Anda menjadi representasi perantara yang disebut kode operasi, lalu mesin virtual mengeksekusinya. Memahami alur ini membantu menjelaskan performa, OPcache, dan JIT.

Pelajaran ini membahas alur kode sumber → token → AST → kode operasi → eksekusi VM.

Alur Pemrosesan

Setiap permintaan ke berkas PHP melewati empat fase:

  • Analisis leksikal — teks sumber → token (pemindai berbasis re2c)
  • Penguraian — token → Pohon Sintaksis Abstrak (tata bahasa Bison)
  • Kompilasi — AST → larik kode operasi (op_array)
  • Eksekusi — Zend VM menelusuri kode operasi

Tanpa OPcache, tiga fase pertama diulang pada setiap permintaan.

Pembuatan Token

Penganalisis leksikal mengubah karakter menjadi token seperti T_VARIABLE, T_ECHO, T_STRING. PHP menyediakan akses ke tahap ini melalui token_get_all() / PhpToken, persis seperti yang digunakan alat seperti PHP-CS-Fixer.

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

Token diuraikan menjadi pohon simpul — simpul penugasan yang anak-anaknya berupa variabel dan ekspresi operasi biner. PHP membangun AST ini secara internal (dan nikic/php-parser merekonstruksi AST yang setara di lingkungan pengguna untuk alat analisis statis seperti PHPStan).

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

Kode Operasi

Kompilator menghasilkan larik kode operasi: daftar datar berisi kode operasi. Setiap kode operasi memiliki nomor kode operasi (misalnya ZEND_ADD, ZEND_ECHO, ZEND_ASSIGN) dan paling banyak dua operand serta satu hasil, yang masing-masing berupa variabel terkompilasi (CV), nilai sementara (TMP), atau konstanta.

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

Memeriksa Kode Operasi

Anda dapat menampilkan kode operasi yang dihasilkan dengan ekstensi VLD atau opcache.opt_debug_level milik OPcache. Hal ini memperlihatkan pelipatan konstanta, eliminasi kode mati, serta cara alur kontrol diubah menjadi kode operasi JMP/JMPZ.

# 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

Variabel Terkompilasi (CV)

Variabel lokal bukan pencarian dalam tabel hash pada kode terkompilasi — kompilator menetapkan slot CV bernomor untuk masing-masing variabel. Mengakses $x untuk kedua kalinya adalah pengindeksan larik, bukan pencarian dalam tabel simbol. Inilah salah satu alasan utama variabel lokal bekerja cepat.

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

Perulangan Eksekusi VM

Pelaksana (execute_ex) menelusuri larik kode operasi. Setiap kode operasi dipetakan ke fungsi penangan; PHP dapat membangun pemanggilan ini sebagai pernyataan switch besar, goto terhitung, atau bentuk hibrida (bawaan dan tercepat pada kompilator yang mendukungnya). Penunjuk opline bergerak maju; kode operasi JMP memindahkannya untuk mengatur alur kontrol.

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

Peran OPcache

OPcache menyimpan larik kode operasi terkompilasi dalam memori bersama, sehingga analisis leksikal, penguraian, dan kompilasi dilewati pada permintaan berikutnya. OPcache juga menjalankan tahap pengoptimalan (pelipatan konstanta, penghapusan kode mati, penggabungan kode operasi). VM tetap mengeksekusi kode operasi yang tersimpan pada setiap permintaan — di situlah JIT nantinya membantu.

Biaya Pemanggilan Fungsi

Pemanggilan fungsi menambahkan bingkai tumpukan VM baru: kode operasi INIT_FCALL, SEND_VAL/SEND_VAR untuk setiap argumen, lalu DO_FCALL. Memahami hal ini menjelaskan mengapa terlalu banyak pemanggilan fungsi kecil menimbulkan biaya yang dapat diukur dan mengapa penyisipan fungsi/JIT penting dalam perulangan panas.

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

Penghentian Permintaan

Setelah eksekusi selesai, PHP membongkar permintaan: variabel yang sedang digunakan dibebaskan, keluaran dikirim, lalu mesin mengatur ulang arena pengalokatornya. Dalam model FPM tanpa sumber daya bersama, setiap permintaan dimulai dari keadaan bersih — itulah sebabnya galat fatal dalam satu permintaan tidak dapat merusak permintaan lain. Larik kode operasi bersama milik OPcache tetap bertahan di antara permintaan; keadaan pelaksana tidak.

Pemeriksaan Singkat

Apa sebenarnya yang disimpan OPcache agar kompilasi ulang dapat dilewati?

Ringkasan

Alur Zend adalah analisis leksikal → penguraian → kompilasi → eksekusi. Kode sumber menjadi token, lalu AST, kemudian larik kode operasi yang dijalankan oleh perulangan pelaksana VM, dengan variabel lokal disimpan dalam slot CV bernomor dan pemanggilan fungsi menambahkan bingkai tumpukan. OPcache menyimpan larik kode operasi (beserta tahap pengoptimalan), sehingga hanya eksekusi yang diulang pada setiap permintaan.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Cara Kerja Zend Engine” gratis?

Ya — teks lengkap “Cara Kerja Zend Engine” 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 “Cara Kerja Zend Engine”?

Telusuri PHP dari kode sumber, opcode, hingga eksekusi. 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 1 dari 4.

Berapa lama pelajaran “Cara Kerja Zend Engine” 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

  1. Cara Kerja Zend Engine
  2. Manajemen Memori dan Pengumpulan Sampah
  3. OPcache dan Kompilasi JIT
  4. Menulis Ekstensi PHP Dasar dalam C
← Kembali ke PHP Academy