PHP Compilation Pipeline
Also Known As
PHP pipeline
Zend VM
opcode compilation
PHP compiler internals
TL;DR
Source code → lexer → tokens → parser → AST → compiler → opcodes → Zend VM — OPcache intercepts after compilation to cache and reuse opcodes across requests.
Explanation
PHP execution pipeline: (1) Lexer: source text → token stream (T_FUNCTION, T_STRING, T_WHITESPACE). (2) Parser: tokens → Abstract Syntax Tree using LALR(1) grammar. (3) Compiler: AST → opcode array (zend_op structs — ZEND_ADD, ZEND_CALL, ZEND_RETURN). (4) Zend VM: executes the opcode array. OPcache intercepts after step 3: serialises compiled opcodes to shared memory — subsequent requests fetch opcodes directly, skipping steps 1-3. JIT (PHP 8.0+): OPcache's JIT further compiles hot opcodes to native x86/ARM machine code.
Common Misconception
✗ PHP is interpreted line-by-line — PHP compiles the entire file to opcodes before executing any of it; the 'interpreted' label refers to the absence of AOT native compilation, not line-by-line execution.
Why It Matters
OPcache provides 2-5x speedup by skipping lexing, parsing, and compilation on every request; syntax errors appear before any code runs (they are compilation errors); JIT helps CPU-bound code but not I/O-bound web requests.
Common Mistakes
- Assuming PHP re-lexes and re-parses files on every request without OPcache
- Expecting syntax errors to appear lazily at the line they are on — errors appear at compile time
- Disabling OPcache in production — the single biggest PHP performance regression possible
- Thinking OPcache opcodes are the same as JIT-compiled native code — they are different stages
Code Examples
✗ Vulnerable
// Expecting lazy evaluation:
if (false) {
$x = 1 +; // Syntax error on this line
}
// Assumption: no error — dead branch
// Reality: PHP compiles the entire file first
// Fatal error: parse error, unexpected ';' — before any code executes
✓ Fixed
// OPcache eliminates recompilation:
// Request 1 (cold): lex → parse → compile → store in shared memory
// Request 2 (warm): fetch opcodes from shared memory → execute directly
// Speedup: skip ~90% of compilation work per request
// Verify OPcache is working:
$status = opcache_get_status();
// Healthy production: hit rate > 99%
// opcache_hit_rate = hits / (hits + misses)
Tags
🤝 Adopt this term
£79/year · your link shown here
Added
16 Mar 2026
Edited
22 Mar 2026
Views
34
🤖 AI Guestbook educational data only
|
|
Last 30 days
Agents 0
No pings yet today
No pings yesterday
Perplexity 10
Amazonbot 8
Unknown AI 3
Ahrefs 2
SEMrush 2
Google 1
Also referenced
How they use it
crawler 25
pre-tracking 1
Related categories
⚡
DEV INTEL
Tools & Severity
🔵 Info
⚙ Fix effort: Medium
⚡ Quick Fix
Understanding the pipeline explains OPcache's value: tokenise → parse → compile opcodes happens once; opcache stores the result so subsequent requests execute immediately
📦 Applies To
PHP 5.0+
web
cli
🔗 Prerequisites
🔍 Detection Hints
OPcache disabled wasting parse/compile time on every request; no understanding of why cache:clear affects performance
Auto-detectable:
✓ Yes
opcache-gui
blackfire
⚠ Related Problems
🤖 AI Agent
Confidence: Low
False Positives: High
✗ Manual fix
Fix: Medium
Context: File