PHP è un linguaggio server-side di alto livello interpretato. Questo significa che tutto il codice sorgente contenuto nei file PHP deve essere convertito in codice macchina per poter essere eseguito dal processore e restituire, ad esempio, la pagina web desiderata.
L’interpretazione del codice viene eseguito da un programma chiamato interprete. Il suo lavoro è quello di convertire riga per riga il codice da dover eseguire per soddisfare una determinata richiesta.
Nel caso di PHP l’interprete è lo Zend Engine: un programma scritto nel linguaggio C che prende il nome da quello di due programmatori: Zeev Suraski e Andi Gutmans.
Questi programmatori, che poi crearono l’azienda Zend, affiancarono il fondatore di PHP, Rasmus Lerdof, nello sviluppo del linguaggio e nella sua espansione.
Voglio introdurti lo Zend Engine parlandoti un po’ delle sue origini e della sua evoluzione.
Indice riassuntivo
Origini e evoluzione dello Zend Engine
La rapida diffusione di PHP su progetti grandi e complessi, spinse gli sviluppatori a rendere questo linguaggio sempre più veloce col passare degli anni.
Infatti PHP all’inizio era concepito per semplici siti e blog, quindi gli sviluppatori si limitavano a ottimizzare quello che già c’era.
Con l’aumentare della sua popolarità sono state sviluppate nuove funzionalità, sono stati risolti moltissimi bug e la crescente necessità di avere un linguaggio rapido e performante ha spinto i due programmatori, Suraski e Gutmans, a creare un interprete sempre più rapido.
La primissima versione di PHP non aveva affatto Zend come interprete, ma era una raccolta di script CGI scritti in C. Non c’era nemmeno nella versione PHP/FI, quando Rasmus estese PHP per processare i form HTML e per connettersi ai database.
Il motore Zend è stato annunciato il 4 gennaio 1999, quando Suraski e Gutmans stavano riscrivendo il core di PHP della precedente versione 3.0. Il nome Zend deriva dalla contrazione dei nomi dei due programmatori Zeev e Andy.
PHP 3.0 aveva il suo parser. Fu scritto dai due sviluppatori nel 1997, quando l’acronimo PHP cambiò di significato in HyperText PreProcessor. Ma questa versione non era sufficientemente veloce e performante, quindi c’era bisogno di un grosso cambiamento.
La versione PHP 4.0, uscita nel 22 maggio 2000, fu accompagnata ufficialmente dallo Zend Engine 1, il primissimo interprete scritto dai due programmatori.
Nello stesso anno, l’8 marzo, fu annunciato lo Zend Optimizer, un’applicazione gratuita che migliora notevolmente le performance delle applicazioni PHP.
Zend Optimizer esegue i file codificati da Zend Encoder, generando un codice che è dalle 2 alle 10 volte più rapido. Le applicazioni possono essere dal 40% al 100% più veloci.
Su Zend stava nascendo un vero e proprio framework che si incastrava (e tutt’ora integrato) perfettamente in PHP, l’Optimizer dalla versione 5.3 è inclusa nella distribuzione standard di PHP.
Con l’uscita di PHP 5 l’interprete viene aggiornato e migliorato: esce lo Zend Engine 2.
PHP subisce un notevole miglioramento in termini di performance con l’uscita della versione 7.0 affiancato dallo Zend Engine 3: è veloce più del doppio della versione 5.6 (l’ultima della serie PHP 5.0).
Attualmente, con PHP 8, abbiamo lo Zend Engine 4 ancora più rapido con il supporto alla compilazione JIT (just-in-time).
Prima di passare al meccanismo dello zend engine, ripassiamo brevemente come funziona php (poi creare un articolo su come funzione php)
Come funziona PHP su un Web Server in breve
Prima di passare al meccanismo di funzionamento dello Zend Engine, ripassiamo velocemente come funziona PHP su un Web Server a seguito di una richiesta.
In questo caso analizziamo una richiesta di tipo GET per visualizzare, ad esempio, la home page del mio sito.
Per comprendere appieno lo schema è necessario avere una minima conoscenza della tecnologia HTTP, di PHP e dei web server.
PHP su un web server funziona nel seguente modo:
- Tramite il browser (client) viene effettuato un collegamento all’indirizzo michelemincone.com. La richiesta è di tipo GET (dall’inglese ‘ottenere‘) e questa viene mandata al web server.
- Il web server processa la richiesta elaborando il file PHP da restituire in formato HTML. Questa conversione da PHP in HTML viene effettuata dallo Zend Engine.
- Infine, c’è la risposta del server. La pagina web dopo essere elaborata viene mandata al browser dell’utente in formato HTML e viene finalmente visualizzata. In questo caso vedremmo la home page (index.php) del mio sito.
In questo caso ho preso in considerato una semplice richiesta di tipo GET per visualizzare una semplice pagina web.
Ma la richiesta poteva essere anche di tipo POST nel caso dell’invio di un form HTML con questo metodo HTTP.
Nota bene che all’interno del web server potrebbe verificarsi un collegamento al database tramite PHP se è necessario al fine dell’ottenimento di dati indispensabili (logo, testi, titoli, immagini, articoli ecc.)
Dato che il browser non può leggere il codice PHP, tutte le operazioni scritte in questo linguaggio vengono interpretate dallo Zend Engine per elaborare la pagina HTML finale.
Che cos’è lo Zend Engine
In breve, lo Zend Engine è un programma che funziona da compilatore e ambiente runtime per il linguaggio di programmazione PHP. Esso consiste nella Zend Virtual Machine (ZVM) che è composta dallo Zend Compiler e dallo Zend Executor.
Il meccanismo dello Zend Engine
Ogni script PHP richiesto viene processato dal suo interprete.
Nell’esempio precedente, la home page è il risultato dell’elaborazione dei codici PHP del file presente sul server con il nome index.php.
Il meccanismo dello Zend Engine è il seguente:
- Dopo l’esecuzione di un codice in PHP questo viene caricato in memoria e lo Zend Engine lo compila in zend opcodes.
- Gli opcodes vengono eseguiti per elaborare il codice HTML della pagina.
- La pagina HTML viene inviata al browser.
- Infine la memoria viene liberata per dare spazio a un prossimo script PHP di un’altra richiesta HTTP.
I zend opcodes (opcodes sta per operational codes, codice operativo) non sono altro che codici di basso livello eseguibili dal computer. PHP essendo un linguaggio di alto livello deve essere convertito in codice macchina per poter essere eseguito dal processore come istruzioni binarie.
Ricordo che lo Zend Engine si occupa anche di:
- Analisi della sintassi, compilazione in memoria e esecuzione del codice PHP.
- Implementa le strutture dati standard di PHP.
- Interfaccia PHP con le sue estensioni esterne (ad esempio HTTP e FTP).
- Esegue le operazioni standard e di basso livello, tra cui la gestione della memoria e delle risorse.
PHP 8.0 e la compilazione JIT
Con PHP 8.0 abbiamo il nuovo e velocissimo Zend Engine 4 in combinazione con due motori di compilazione JIT (Just-In-Time):
- Function JIT
- Tracing JIT
La più promettente è la compilazione Tracing JIT: rende l’esecuzione dei codici PHP tre volte più veloce e le applicazioni long-running 1.5/2 più veloci.
Il Tracing JIT crea e utilizza delle tracce. Queste ultime non sono altro che opcodes (quelli che abbiamo visto prima) o, come vengono chiamati attualmente, VM instructions (dove VM sta per virtual machine).
Assieme alle tracce vengono aggiunte le informazioni del runtime, ovvero le informazioni del programma PHP che viene eseguito e può includere variabili, operandi, classi, funzioni, metodi, e closures.
Ecco un’immagine del workflow che illustra l’esecuzione di uno script PHP in combinazione con l’OPCache e la compilazione JIT:
Approfondisci la compilazione JIT su PHP 8 sul sito di Zend e segui il video ufficiale su questa tecnologia.
Visualizza lo Zend Engine su GitHub
PHP è un linguaggio open-source e l’interprete è parte del linguaggio stesso.
Sulla pagina GitHub di PHP è possibile consultare e analizzare il codice del linguaggio e del compilatore Zend nell’omonima cartella.
Segui gli ultimi aggiornamenti di Zend
Per rimanere aggiornato sulle ultime notizie di Zend Engine, ma anche su Zend come framework per PHP, visita il sito zend.com.