Negli articoli precedenti ho portato una breve introduzione sul linguaggio server-side PHP e ho parlando anche dello Zend Engine: il famoso interprete di PHP.
Oggi voglio mettere la lente di ingrandimento, senza cadere troppo nei tecnicismi e nei dettagli, sul funzionamento di PHP su un Web Server.
Nell’introduzione a PHP ho parlato di questo, ma cerchiamo di andare un po’ più in profondità cercando di esplorare altre aree che non abbiamo visto.
Iniziamo subito!
Indice riassuntivo
Le tecnologie essenziali per lavorare con PHP su un Web Server
PHP può funzionare su due sistemi:
- su un server, parleremo di PHP server-side scripting
- o attraverso un terminale, si tratta del command-line scripting
Oggi vediamo il primo caso: quindi come funziona PHP su un server e di quali tecnologie ho bisogno. Poi vedremo come far funzionare script PHP attraverso il terminale (command-line scripting).
Partiamo col dire che PHP col tempo si è espanso moltissimo e su vari fronti è compatibile con diverse tecnologie.
Puoi installarlo su vari sistemi operativi (MacOS, Windows, Linux), su vari server (Apache, NGINX ecc.) o cloud (AWS, Azure…) e puoi farlo comunicare con diversi database (MySQL, PostgreSQL, Oracle Database, MongoDB ecc.).
Conoscendo quali sono i servizi con cui PHP è compatibile possiamo iniziare a ricostruire quali sono i mattoncini indispensabili per parlare di server-side scripting.
Bene, per poter programmare lato server con PHP e creare un sito web dinamico abbiamo bisogno di:
- un computer alla base, ovvero la parte hardware (può essere il tuo pc o un sistema hardware specifico per server di un provider) con processore, RAM, SSD o HDD e quant’altro;
- un sistema operativo installato su questo computer (Windows, MacOS o Linux, quest’ultimo è quello più usato per eccellenza);
Questa è la base indispensabile da cui partire. Ma non siamo ancora pronti per poter usare PHP.
Infatti su questo ecosistema hardware e software che noi chiamiamo PC o server, abbiamo bisogno di:
- Apache o NGINX, due distinti servizi di web server HTTP, il secondo più veloce del primo.
- MySQL, un fork di quest’ultimo come MariaDB o altri sistemi di database relazionali.
- Un linguaggio di programmazione, in questo caso PHP che conterrà l’interprete (dato che stiamo trattando un linguaggio interpretato e non compilato).
Quindi sul PC o sul computer di un hosting provider c’è bisogno che siano installati questi servizi. Potremmo averne altri di servizi ma questa è la base di partenza.
Ora vediamo un po’ più nel dettaglio i servizi elencati.
Il Web Server HTTP (Apache o Nginx)
Apache o NGINX (i web server HTTP per eccellenza) sono installati e configurati per rispondere a precise richieste dell’utente che utilizza il browser.
Queste richieste, definite “richieste HTTP“, sono principalmente quattro: CREATE (crea), READ (leggi), UPDATE (aggiorna) e DELETE (elimina).
Il server a ogni richiesta risponderà con una “risposta HTTP” con il contenuto desiderato dall’utente (es. pagina HTML).
Ad esempio, connettendoti al mio sito eseguirai una richiesta HTTP di tipo GET per ottenere la home page e visualizzarla. Il server riceverà la tua richiesta e ti risponderà con la pagina HTML.
HTTP (Hypertext Transfer Protocol) è alla base delle comunicazioni su internet e avere conoscenze in questa materia è fondamentale in campo sviluppo web.
È bene precisare che Apache e NGINX non vengono installati assieme su un server, ma sono opzioni. NGINX è l’opzione numero uno oggi perché è un web server molto più veloce rispetto ad Apache.
Il database relazionale
Un database relazionale (o relational database in inglese il cui acronimo è RDB) è un database che serve a collezionare dati sulla base di tabelle organizzate in righe e in colonne.
Tabelle, righe e colonne sono collegate tra loro tramite relazioni e da qui questi database prendono il nome di “relazionali“.
All’interno di righe e colonne è possibile inserire dati di vario tipo che poi possono essere ripescate sul sito web o web application tramite un linguaggio di programmazione lato server (PHP, Java, Python, Perl…).
Per ripescare dati da un database relazionale viene usato un linguaggio domain-specific chiamato SQL (Structured Query Language) chiamate query.
Tramite una query SQL è possibile leggere, inserire, eliminare e aggiornare dati e tabelle (le operazioni CRUD).
Più precisamente i database relazionali vengono intesi come veri e propri sistemi, da qui nasce il nome di RDBMS o “Relational DataBase Management System”.
Il linguaggio di programmazione lato server
Il linguaggio di programmazione lato server è un pacchetto installato sul server ed è quello che sarà utilizzato per scrivere il back-end e come devono essere processate le pagine web.
Prima che il server HTTP risponda, il codice contenuto nei file di un determinato linguaggio di programmazione, che può essere interpretato o compilato, viene eseguito e il risultato di questa esecuzione viene inviata dal server al browser.
Tra i linguaggi lato server più famosi abbiamo quelli interpretati come PHP, Perl e Python e compilati come Java, Python e C# con ASP.NET.
Nel caso di PHP sarà lo Zend Engine a interpretare il codice trasformandolo in codice macchina: un codice di basso livello.
Con i linguaggi di programmazione lato server è possibile:
- generare pagine web dinamiche e quindi creare template HTML
- gestire i file sul server
- fare query al database
- ottenere informazioni del server
- processare le richieste HTTP (POST, GET, DELETE, READ ecc.), ad esempio nel caso in cui bisogna elaboratre un form HTML e estrapolare dati da esso
- lavorare con dipendenze e framework esterni
- lavorare con i cookie e le sessioni utente
- e molto altro…
Oltre al linguaggio server, che può essere PHP, è possibile, naturalmente, lavorare anche con HTML e CSS e con linguaggi lato-client come JavaScript e usare librerie come ReactJS.
Come funziona PHP su un Web Server
Ogni volta che ti colleghi a un sito web tramite browser, come ad esempio il mio o quello di Wikipedia, quando clicchi su un link per atterrare su una determinata pagina che ti interessa, quando compili un modulo o quando effettui un acquisto invii delle richieste sul server e questo attuerà una serie di meccanismi per soddisfare la tua risposta.
Questa lista di azioni vengono propriamente chiamate richieste HTTP. HTTP è il protocollo standard per la trasmissione di dati e comunicazione sul web e permette di creare un collegamento bidirezionale tra client e server.
Quando al server arriva la richiesta HTTP di tipo POST perché tu hai compilato un modulo di contatto, questo ti risponderà (reazione chiamata risposta HTTP) con un messaggio di successo: ‘la tua richiesta è stata mandata con successo’.
Ancor prima però, avviene qualcosa di specifico sul server.
Uno script adibito alla validazione e al processo dei dati in entrata da un form, più precisamente da una specifica richiesta HTTP di tipo POST, farà il lavoro sporco: validerà i dati, li processerà, li sanificherà e li salverà sul database.
Solo quando tutte queste operazioni sono avvenute con successo riceverai la risposta che la tua richiesta è stata inviata.
Per questo meccanismo ho preparato uno schema rappresentativo. L’immagine riporta l’esempio del collegamento sul mio sito:
Quando devi collegarti a un sito web, la prima cosa che fai è aprire il browser e digitare l’indirizzo del sito.
Ad esempio, facciamo finta che ti stai collegando al mio sito web.
Quello che succede è che quando premi invio sulla barra URL il tuo browser manda una richiesta HTTP al server sul quale il mio sito è ospitato (fase 1 dell’immagine).
La richiesta HTTP che stai facendo, ma che tu non percepisci visivamente, è di tipo GET (dall’inglese “ottenere“).
Il server riceverà questa richiesta e la processerà in un determinato modo:
- richiamerà la risorsa o il file da elaborare presente sul server in base alla richiesta che hai fatto. Collegandoti a michelemincone.com il server andrà alla ricerca della home page che corrisponde al documento index.php o a un altro file per elaborare questa pagina.
- Una volta che il server ha individuato la risorsa da elaborare, in questo caso è l’index.php, il codice all’interno di esso deve essere elaborato.
- L’elaborazione del codice PHP richiesto sarà eseguito dall’interprete, lo Zend Engine, che convertirà il codice in linguaggio machina affinché possa essere eseguito dal processore.
- In questo esatto momento, se il codice lo prevede, vengono eseguite collegamenti e query al database o collegamenti a servizi esterni o ad API
- Il codice di basso livello che viene eseguito genererà un documento in formato HTML
A questo punto il server ha elaborato il contenuto che tu desideri visualizzare. Quindi ti invierà la home page tramite una risposta HTTP contenente l’HTML.
Quello che visualizzerai non è codice PHP ma puro codice HTML con tutti i contenuti elaborati. Infatti, ispezionando le pagine web sul browser non vedrai codice PHP proprio perché il browser non è in grado di leggerlo.
Quindi il server penserà all’elaborazione del contenuto a monte. Prima ancora che ti venga inviata la pagina web.
Considera che tutto questo accade nel giro di pochi millisecondi e possono entrare in gioco anche altre tecnologie come sistemi di caching, API, richieste a server esterni, librerie e framework PHP e molto altro.
L’interprete di PHP
PHP è un linguaggio interpretato e non compilato come Java o C#. Quindi è indispensabile la presenza di un programma chiamato interprete che converta di volta in volta il codice PHP in codice macchina.
Il codice macchina è eseguibile dal computer, dal processore più precisamente, e l’esecuzione dello script è fattibile.
L’interprete del linguaggio PHP è lo Zend Engine e ne parlo meglio in un articolo più approfondito:
PHP è un linguaggio veloce o lento?
PHP nel corso degli anni si è evoluto molto. Con l’ultima versione PHP 8 abbiamo raggiunto performance ottime. Anche per il discorso sicurezza gli sviluppatori hanno fatto un’ottimo lavoro.
PHP 8 è interpretato da Zend Engine 4 ed è presente la compilazione JIT nel workflow: una sinergia tra tecnologie che rende ancor più rapida l’esecuzione degli script.
Come viene processato un form HTML da PHP
PHP è utilissimo per processare moduli HTML anche molto complessi.
È possibile captare i dati in entrata sul server, elaborarli, validarli, sanificarli e salvarli sul database.
Prendiamo come esempio questa infografica che ho realizzato:
Premetto che vedremo il meccanismo un po’ più nel dettaglio in un altro articolo con qualche esempio di codice.
Ma brevemente, ecco come funziona il meccanismo di elaborazione dati quando un form HTML viene inviato dall’utente:
- Sul browser, l’utente inserisce i dati sul modulo HTML.
- In seguito, clicca sul pulsante “Invia” e viene eseguito il submit dei dati (invio).
- Al click del pulsante viene inviata una richiesta HTTP di tipo POST, poteva essere anche GET ma abbiamo dati sensibili quindi non è opportuno, al server.
- La richiesta HTTP viene presa in carico dal server.
- Il server metterà a disposizione il file PHP contenente lo script che si occupa di gestire questa determinata operazione (es. functions.php).
- Lo script in questione validerà i dati, verificando se sono disponibili (con la funzione
!empty()
) e validi (filter_var()), li sanificherà per evitare problemi di sicurezza e effettuerà vari calcoli. - Se tutti questi procedimenti vengono effettuati con successo (validazione, sanificazione e calcoli), i dati processati vengono salvati sul database MySQL con PDO o funzioni/oggetto
mysqli
. - Sempre se la richiesta è stata processata correttamente, viene inviata una risposta HTTP al browser dell’utente indicando lo stato dell’azione (status code) dell’azione fatta prima.
- Se la validazione dei dati non viene superata non si arriverà alla sanificazione di questi e nemmeno al loro salvataggio sul database. La risposta HTTP darà un responso di fallimento della richiesta.
Nota bene: la supeglobale $_SERVER, la variabile che fornisce informazioni sul server e sull’ambiente di esecuzione, traccerà la richiesta HTTP di tipo POST inserendola nell’array.
Caricamento di un file sul server tramite PHP
Attraverso un modulo HTML è possibile caricare e processare uno o molteplici file processandoli grazie a PHP.
La variabile superglobale $_FILES dovrà essere utilizzata con PHP per validare, sanificare e calcolare una serie di parametri per accettare e caricare sul server uno o più file.
Per caricare file il modulo HTML deve per forza usare il metodo POST e avere l’attributo enctype="multidata/form-data"
su <form>
.
Questo attributo permette proprio di inviare file in vari formati tramite un form tramite il metodo POST.
Vedremo il meccanismo più nel dettaglio in un altro articolo con esempi di codice, ma il meccanismo è simile a quello descritto nell’infografica precedente.
Ma ci sono step fondamentali da capire come la validazione e l’ottenimento del formato, lo spostamento del file sul server e la generazione di un nome unico per il file.
INOLTRE PARLARE DELLA VARIABILE SUPERGLOBALE $_SERVER AL TITOLO “COME FUNZIONA PHP SU UN WEB SERVER” poi rimetterlo sul titolo “COME VIENE PROCESSATO UN FORM HTML” e far vedere che la richiesta nell’array cambia e diventa POST
Poi mettere titolo su come PHP effettua richiesta al database
PHP e la sicurezza
Quando utilizzi PHP su un server è bene tenere a mente tutte le buone pratiche per mantenere il tuo codice al sicuro.
Nel caso in cui venga processato un modulo HTML è bene ricordare che tutti i dati in entrata devono essere:
- validati
- sanificati
Non vorrai mai avere una mail non valida e nemmeno ottenere un dato che alla fine è un codice malevolo.
Anche nel caso in cui effettui una connessione al database, devi essere certo che il codice eseguito per la query SQL sia sicuro.
Il codice PHP utilizzato per effettuare query al database deve essere sanificato, se vengono presi input da moduli, bisogna effettuare l’escaping e ricorrere al data binding.
Parlare di sicurezza e PHP in questo articolo sarebbe folle perché c’è molto di cui parlare, però ho affrontato questo argomento in un altro articolo:
Il certificato SSL sul web
Come ho detto, il protocollo HTTP è una tecnologia usata per trasferimento dati sul web nelle comunicazioni tra browser e server.
Inviando un modulo mandi dati al server dal tuo browser tramite questo protocollo. Stessa cosa quando effettui pagamenti online.
Immagine di inserire i tuoi dati personali e i dati della tua carta di credito su un sito per acquistare un prodotto.
Con il solo protocollo HTTP questi dati sarebbero visibili a chiunque volesse intercettare la tua comunicazione con il server di questo eCommerce.
Per cui è necessaria una chiave di cifratura che va a criptare la comunicazione tra il tuo browser e il server rendendo le informazioni scambiate illeggibili.
Il malintenzionato potrà leggere le informazioni decifrandole solo se avrà in mano la chiave.
Questa chiave non è altro che il certificato SSL che renderà le comunicazioni HTTP sicure. Passare da HTTP a HTTPS (HyperText Transfer Protocol Secure) è fondamentale per tutti i siti.
Proteggerà i dati personali scambiati tra browser e server, è un elemento essenziale da includere quando si parla di sicurezza in ambito web.
A questo vanno aggiunte tutte le migliori pratiche di sicurezza quando si programma lato server con PHP.
Conclusioni
Spero che questo articolo ti sia stato d’aiuto nel capire qual è il meccanismo che si trova dietro PHP e quindi come vengono processate tutte le azioni degli utenti sui siti web.
Ho portato alcuni esempi e anche la sicurezza in ambito web, un argomento fondamentale e che si incastra benissimo con l’argomento di oggi.
Per oggi è tutto, a presto!