Cara Zend Engine Berfungsi
Jejaki PHP daripada sumber kepada opcode hingga pelaksanaan.
Cara Zend Engine Berfungsi ialah pelajaran PHP Academy percuma di CoddyKit. Ini ialah pelajaran 1 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.
Di Dalam Enjin
PHP tidak ditafsir baris demi baris daripada kod sumber. Zend Engine mengkompil skrip Anda menjadi perwakilan perantaraan yang dipanggil kod operasi, kemudian mesin maya melaksanakannya. Memahami aliran pemprosesan ini menjelaskan prestasi, OPcache dan JIT.
Pelajaran ini menerangkan aliran kod sumber → token → AST → kod operasi → pelaksanaan VM.
Aliran Pemprosesan
Setiap permintaan terhadap fail PHP melalui empat fasa:
- Analisis leksikal — teks sumber → token (pengimbas berasaskan re2c)
- Penghuraian — token → Pokok Sintaks Abstrak (tatabahasa Bison)
- Kompilasi — AST → tatasusunan kod operasi (op_array)
- Pelaksanaan — VM Zend melintasi kod operasi
Tanpa OPcache, tiga fasa pertama diulang pada setiap permintaan.
Pengekalan Token
Penganalisis leksikal menukar aksara menjadi token seperti T_VARIABLE, T_ECHO, T_STRING. PHP menyediakan akses kepada peringkat ini melalui token_get_all() / PhpToken, iaitu perkara yang digunakan oleh 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 dihuraikan menjadi pepohon nod — nod penetapan yang anak-anaknya ialah pemboleh ubah dan ungkapan operasi binari. PHP membina AST ini secara dalaman (dan nikic/php-parser membina semula AST yang setara dalam ruang pengguna untuk alat analisis statik 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";
?>Kod Operasi
Pengkompil menghasilkan op_array: senarai rata kod operasi. Setiap kod operasi mempunyai nombor kod operasi (contohnya ZEND_ADD, ZEND_ECHO, ZEND_ASSIGN) serta sehingga dua operan dan satu hasil, yang setiap satunya merupakan pemboleh ubah dikompil (CV), pemboleh ubah sementara (TMP) atau pemalar.
<?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 Kod Operasi
Anda boleh memaparkan kod operasi yang dijana dengan sambungan VLD atau opcache.opt_debug_level OPcache. Ini mendedahkan penggubahan pemalar, penghapusan kod mati dan cara aliran kawalan menjadi kod 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 optPemboleh Ubah Dikompil (CV)
Pemboleh ubah setempat bukan carian jadual cincang dalam kod yang dikompil — pengkompil menetapkan slot CV bernombor kepada setiap pemboleh ubah. Mengakses $x buat kali kedua ialah indeks tatasusunan, bukannya carian jadual simbol. Inilah sebab utama pemboleh ubah setempat pantas.
<?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;
?>Gelung Pelaksanaan VM
Pelaksana (execute_ex) melintasi op_array. Setiap kod operasi dipetakan kepada fungsi pengendali; PHP boleh membina penghantaran ini sebagai pernyataan suis gergasi, lompatan terhitung atau bentuk hibrid (lalai dan terpantas pada pengkompil yang menyokongnya). Penuding opline bergerak ke hadapan; kod operasi JMP mengalihkannya untuk aliran kawalan.
<?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";
?>Tempat OPcache Digunakan
OPcache menyimpan op_array dalam memori dikongsi, lalu melangkau analisis leksikal, penghuraian dan kompilasi pada permintaan berikutnya. Ia juga menjalankan fasa pengoptimuman (penggubahan pemalar, penghapusan kod mati dan penggabungan kod operasi). VM masih melaksanakan kod operasi yang dicache pada setiap permintaan — di sinilah JIT kemudiannya membantu.
Kos Overhed Panggilan Fungsi
Panggilan menolak bingkai tindanan VM baharu: kod operasi INIT_FCALL, SEND_VAL/SEND_VAR bagi setiap hujah, kemudian DO_FCALL. Mengetahui perkara ini menjelaskan mengapa panggilan fungsi kecil yang berlebihan mempunyai kos yang boleh diukur dan mengapa pengembangan sebaris/JIT penting dalam gelung 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
?>Penamatan Permintaan
Selepas pelaksanaan, PHP membersihkan permintaan: pemboleh ubah yang sedang digunakan dibebaskan, keluaran dihantar, kemudian enjin menetapkan semula arena pengagihnya. Dalam model FPM tanpa perkongsian, setiap permintaan bermula dalam keadaan bersih — sebab itulah ralat maut dalam satu permintaan tidak boleh merosakkan permintaan lain. op_array dikongsi OPcache kekal merentas permintaan; keadaan pelaksana tidak.
Semakan Pantas
Apakah sebenarnya yang disimpan oleh OPcache untuk mengelakkan kompilasi semula?
Ringkasan
Aliran Zend ialah analisis leksikal → penghuraian → kompilasi → pelaksanaan. Kod sumber menjadi token, kemudian AST, kemudian op_array kod operasi yang dilaksanakan oleh gelung pelaksana VM, dengan pemboleh ubah setempat disimpan dalam slot CV bernombor dan panggilan menolak bingkai tindanan. OPcache mencache op_array (serta fasa pengoptimuman), jadi hanya pelaksanaan diulang bagi setiap permintaan.
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 “Cara Zend Engine Berfungsi” percuma?
Ya — teks penuh “Cara Zend Engine Berfungsi” 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 “Cara Zend Engine Berfungsi”?
Jejaki PHP daripada sumber kepada opcode hingga pelaksanaan. 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 1 daripada 4.
Berapa lamakah pelajaran “Cara Zend Engine Berfungsi” 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
- Cara Zend Engine Berfungsi
- Pengurusan Memori dan Pengumpulan Sampah
- Penyusunan OPcache dan JIT
- Menulis Sambungan PHP Asas dalam C