Lato server: PHP
Programmazione lato server
Il tipo di programmazione web che abbiamo visto finora è detto “lato client” (client-side):
Passiamo alla programmazione lato server (server side)
Rivediamo come funzionano client e server nel web
CLIENT: l’utente inserisce l’URL sul browser
http://www.dieei.unict.it
Il browser invia una richiesta (HTTP GET) al server che si trova all’indirizzo http://www.dieei.unict.it
Guardiamo questo processo più in dettaglio
Il browser crea una richiesta (stringa di testo) formattata secondo la sintassi delle richieste HTTP
Il browser chiede al sistema operativo di inoltrare la richiesta a http://www.dieei.unict.it
HTTP Request
GET /index.html HTTP/1.1
Host: www.dieei.unict.it
Connection: keep-alive
Cache-Control: max-age=0
User-Agent: Mozilla/5.0
Accept: text/html, application/xhtml+xml
Accept-Encoding: gzip, deflate, sdch
Accept-Language: it-IT,en-US,en
Il sistema operativo esegue una ricerca DNS per reperire l’indirizzo IP di www.dieei.unict.it
Il server DNS comunica l’indirizzo IP, ad es. 151.97.240.10
DNS Server
(Routing, etc…)
Il sistema operativo apre una connessione TCP con il computer al 151.97.240.10
Dopo aver stabilito la connessione TCP, attraverso essa il sistema operativo manda la richiesta HTTP al server
151.97.240.10
(Routing, etc…)
SERVER: Computer associato all’indirizzo 151.97.240.10
151.97.240.10
(Routing, etc…)
Su questo computer gira un programma chiamato web server:
151.97.240.10
"Server"
La definizione di server è un po’ ambigua:
In genere, si capisce dal contesto.
Socket
Cosa significa che un programma “ascolti” i messaggi in arrivo?
Quando il server (programma) è avviato, esegue del codice per aprire una socket e permettere la ricezione di messaggi di dalla rete (tramite il sistema operativo)
Una socket è un’estremità di un canale di comunicazione, attraverso la quale inviare e ricevere dati.
In ogni caso, il server web astrae tutto questo, quindi non c’è bisogno che ci poniamo il problema.
Tramite la connessione TCP stabilita tra il client e il server, entrambi possono scambiarsi messaggi.
151.97.240.10
(Routing, etc…)
Client
Server
151.97.240.10
Il sistema operativo trasmette al server web (programma) la richiesta ricevuta
Il server web analizza la richiesta HTTP e genera il messaggio da trasmetter al client (es. il contenuto di un file HTML). Formatta questo messaggio secondo la sintassi HTTP, quindi chiede al sistema operativo di inviarlo tramite HTTP al client.
151.97.240.10
La risposta HTTP arriva al sistema operativo del client, che la inoltra al browser, che visualizza la pagina web.
(Routing, etc…)
Riassunto
Quando aprite un URL:
Quando il server (computer) riceve il messaggio:
Client
(Routing, etc…)
Server
Porte e binding
Porta: nel contesto delle reti, una porta rappresenta un’estremità di una connessione “logica” tra due computer
Quando è avviato il processo server, questo dice al sistema operativo su quale porta ascolta: questa operazione è chiamata binding.
Il sistema operativo del client apre una connessione TCP verso la porta 80 �del computer al
151.97.240.10.
Una connessione TCP richiede l’indirizzo IP e il numero di porta.
Il processo server ascolta sulla porta 80 �in attesa di richieste.
151.97.240.10
(Routing, etc…)
Porte di default
Ci sono diverse porte di default utilizzate la protocolli particolari:�
21: File Transfer Protocol (FTP)
22: Secure Shell (SSH)
23: Telnet remote login service
25: Simple Mail Transfer Protocol (SMTP)
53: Domain Name System (DNS) service
80: Hypertext Transfer Protocol (HTTP)
110: Post Office Protocol (POP3)
119: Network News Transfer Protocol (NNTP)
123: Network Time Protocol (NTP)
143: Internet Message Access Protocol (IMAP)
161: Simple Network Management Protocol (SNMP)
194: Internet Relay Chat (IRC)
443: HTTP Secure (HTTPS)
Localhost
Se sul nostro computer gira un server web, possiamo inviargli una richiesta HTTP utilizzando l’URL:
http://localhost:portNumber, ad esempio
Localhost è un nome di host che vuol dire “questo computer”
Server locale
Nei precedenti esempi client/server abbiamo sempre considerato due macchine separate:
Quando eseguiamo il server localmente, il nostro computer funge sia da client che da server.
Client
(Routing, etc…)
Server
Server “reali”
La configurazione dei server “reali” è in genere come segue:
fetch() a localhost
Riceviamo un errore CORS:
Se cerchiamo di accedere a localhost tramite fetch:
CORS
CORS: Cross-Origin Resource Sharing (wiki)
Il browser di default impedisce richieste cross-origin per fetch() e AJAX in generale (ok per immagini e CSS)
È possibile configurare il server web per permettere richieste CORS.
PHP
Pagine web statiche
Vantaggi:
Svantaggi:
Pagine web dinamiche
Generate in funzioni di:
Vantaggi:
Svantaggi:
Applicazioni web
Il server web non è più un semplice fornitore di dati predefiniti, ma una vera e propria applicazione.
Il lato client definisce il front-end, l’interfaccia grafica e la modalità di interazione con l’utente.
Il lato server definisce il back-end, la business logic dell’applicazione, il suo funzionamento in termini di gestione, processamento e trasmissione delle informazioni.
PHP
PHP è un linguaggio di scripting open-source utilizzato per la programmazione server-side.
È probabilmente il più diffuso linguaggio per la programmazione server-side, insieme a JavaScript (NodeJS), C# (Asp.net), Java (Java Server Pages), Ruby, Python
In genere è utilizzato insieme al server web Apache.
PHP
Vantaggi:
PHP
Come funziona?
Uno script in PHP consiste in un file .php, che viene processato dall’interprete PHP.
Di per sé, PHP può essere utilizzato come linguaggio di scripting «normale» (es. Python, Perl).
In un web server, un file .php rappresenta una pagina web (un po’ come abbiamo usato .html finora)
Piuttosto che ritornare direttamente il file come risposta HTTP, il server esegue l’interprete PHP sul file e ritorna l’output dell’interprete.
PHP
Come funziona?
Quando viene richiesto un file .php, il server web analizza il file alla ricerca di tag <?php …………… ?>
Il contenuto dei tag è passato all’interprete PHP, e l’output dell’interprete viene inserito al posto dei tag.
In genere, i file .php contengono un misto di HTML e PHP.
PHP
Come funziona?
NON potete aprire dal browser file PHP allo stesso modo di come avete fatto finora con i file HTML!
Il browser non esegue l’interprete PHP, quindi tratta il file come se fosse un semplice file di testo.
PHP
Come funziona?
NON potete aprire dal browser file PHP allo stesso modo di come avete fatto finora con i file HTML!
Dovete necessariamente passare attraverso il server web.
PHP
PHP: Tag
Es.: Primo.php
PHP: Linguaggio
PHP: Variabili
PHP: Variabili
PHP: Variabili
$var= 5;
$today = “oggi”;
$today = $yesterday;
$today = $today + 3;
PHP: Case sensitive
�
<!DOCTYPE html>�<html>�<body>��<?php�ECHO "Benvenuti alla lezione di PHP!<br>";�echo "Benvenuti alla lezione di PHP!<br>";�EcHo "Benvenuti alla lezione di PHP!<br>";�?>��</body>�</html>
PHP: Case sensitive
<!DOCTYPE html>�<html>�<body>��<?php�$argomento = “PHP";�echo "Benvenuti alla lezione di " . $argomento . "<br>";�echo "Benvenuti alla lezione di " . $ARGOMENTO . "<br>";�echo "Benvenuti alla lezione di " . $arGOmento . "<br>";�?>��</body>�</html>
PHP: Tipi di dato
$var = 5; var è di tipo Integer
- Loosely Typed Language
�
PHP: Conversioni di tipo
$a = 10; //$a è una variabile intera e vale 10
$b = $a * 1.5; // $b è float e vale 15.0
$c = "5+$b" ; // $c è stringa e vale “5+15”
$d = 10.8 ; // $d è float e vale 10.8
$d = (int)$d ; // adesso $d è intera e vale 10
PHP: Apici
<?
$nome = "Anna";
echo = " Ciao $nome ! " ;
echo "<BR><BR>";
echo = ' Ciao $nome ! ' ;
?>
PHP: Scope
<?php�$x = 5; // variabile globale��function Funzione() {� // se si usa x otteniamo un errore� echo "<p>La variabile x vale: $x</p>";�} �Funzione();��echo "<p>La variabile x vale: $x</p>";�?>
PHP: Scope
<?php�function Funzione() {� $x = 5; // visibilità locale� echo "<p>La variabile x vale: $x</p>";�} �Funzione();��// x fuori dalla funzione genera un errore�echo "<p>La variabile x vale: $x</p>";�?>
PHP: Scope
<?php�$x = 5;�$y = 10;��function Funzione() {� global $x, $y;� $y = $x + $y;�}��Funzione();�echo $y; // Uscita = 15�?>
PHP: Scope
<?php�$x = 5;�$y = 10;��function Funzione() {� $GLOBALS['y'] = $GLOBALS['x'] + $GLOBALS['y'];�} ��Funzione();�echo $y; // Uscita = 15�?>
PHP: Scope
<?php�function Funzione() {� static $x = 0;� echo $x;� $x++;�}��Funzione();�Funzione();�Funzione();�?>
PHP: Stampa uscita
<?php�echo "<h2>PHP è divertente!</h2>";�echo "Ciao Mondo!<br>";�echo "Imparare PHP!<br>";�echo "Questa", "stringa", "è", "fatta", "con più parametri.";�?>
<?php�$txt1 = "Imparare PHP";�$txt2 = "Web Programming 2025";�$x = 5;�$y = 4;��echo "<h2>" . $txt1 . "</h2>";�echo "Studiare PHP at " . $txt2 . "<br>";�echo $x + $y;�?>
PHP: Stampa uscita
<?php�print "<h2>PHP è divertente!</h2>";�print "Ciao Mondo!<br>";�print "Imparare PHP!<br>";�?>
<?php�$txt1 = "Imparare PHP";�$txt2 = "Web Programming 2025";�$x = 5;�$y = 4;��print "<h2>" . $txt1 . "</h2>";�print "Studiare PHP at " . $txt2 . "<br>";�print $x + $y;�?>
PHP: print_r
print_r(var_name, return_output)
var_name: nome della variabile
return_output: memorizzare l’ouput in una variable
<?php�$a = array ('a' => 'apple', 'b' => 'banana', 'c' => array ('x', 'y', 'z'));�print_r ($a);�?>
Array
(
[a] => apple
[b] => banana
[c] => Array
(
[0] => x
[1] => y
[2] => z
)
)
PHP: Stringhe
<?php�echo strlen("Web Programming!"); // Uscita: 16�?>
<?php�echo str_word_count("Web Programming!"); // Uscita: 2�?>
strlen:
lunghezza stringa
str_word_count :
Numero parole
<?php�echo strrev("Web Programming!"); // Uscita: !ngimmargorP beW�?>
strrev :
Invertire stringa
<?php�echo strpos("Web Programming!", "Programming"); //Uscita: 5�?>
strpos:
Cercare stringa
str_replace:
Cercare stringa
<?php�echo str_replace("Web", "C", "Web Programming!"); // Uscita: C Programming!�?>
PHP: Stringhe
PHP: Operatori
PHP: if...elseif....else
if (condition) {� code to be executed if this condition is true;�} elseif (condition) {� code to be executed if this condition is true;�} else {� code to be executed if all conditions are false;�}
<?php�$t = date("H");��if ($t < "10") {� echo “Buongiorno!";�} elseif ($t < "20") {� echo “Buon pomeriggio!";�} else {� echo “Buona notte!";�}�?>
PHP: for e foreach
for (init counter; test counter; increment) {� code to be executed;�}
<?php �for ($x = 0; $x <= 10; $x++) {� echo “Il numero e’ : $x <br>";�} �?>
foreach ($array as $value)
{� code to be executed;�}
<?php �$colori = array("rosso","verde","blue"); ��foreach ($colori as $valore) {� echo "$valore <br>";�}�?>
PHP: Array
array();
PHP: Array
PHP: Array
<?php�$cars = array("Volvo", "BMW", "Toyota");�echo “Mi piacciono " . $cars[0] . ", " . $cars[1] . " e" . $cars[2] . ".";�?>
Per sapere quanti elementi ha un array:
$lungh = count($lista);
<?php�$cars = array();
$cars[0] = "Volvo";�$cars[1] = "BMW";�$cars[2] = "Toyota";
�echo "Mi piacciono " . $cars[0] . ", " . $cars[1] . " e" . $cars[2] . ".";�?>
<?php�$cars = array("Volvo", "BMW", "Toyota");�$arrlength = count($cars);��for($x = 0; $x < $arrlength; $x++) {� echo $cars[$x];� echo "<br>";�}�?>
PHP: Array
<?php�$age = array("Pietro"=>"35", "Franco"=>"37",
"Luca"=>"43");�
echo "Pietro ha" . $age['Pietro'] . " anni.";
?>
<?php�$age = array();
$age['Pietro'] = "35";
$age['Franco'] = "37";
$age['Luca'] = "43";
�echo "Pietro ha" . $age['Pietro'] . " anni.";
?>
<?php�$age = array("Pietro"=>"35", "Franco"=>"37", "Luca"=>"43");��foreach($age as $x => $x_value) {� echo "Key=" . $x . ", Value=" . $x_value;� echo "<br>";�}�?>
PHP: Array
$cars = array� (� array("Volvo",22,18),� array("BMW",15,13),� array("Saab",5,2),� array("Land Rover",17,15)� );
<?php�for ($row = 0; $row < 4; $row++) {� echo "<p><b>Riga numero $row</b></p>";� echo "<ul>";� for ($col = 0; $col < 3; $col++) {� echo "<li>".$cars[$row][$col]."</li>";� }� echo "</ul>";�}�?>
PHP: Ordinamento array
PHP: Ordinamento array
<!DOCTYPE html>�<html>�<body>��<?php�$age = array("Pietro"=>"35", "Franco"=>"37", "Luca"=>"43");�ksort($age);��foreach($age as $x => $x_value) {� echo "Key=" . $x . ", Value=" . $x_value;� echo "<br>";�}�?>��</body>�</html>
Key=Franco, Value=37
Key=Luca, Value=43
Key=Pietro, Value=35
PHP: Ordinamento array
<!DOCTYPE html>�<html>�<body>��<?php�$age = array("Pietro"=>"35", "Franco"=>"37", "Luca"=>"43");�asort($age);��foreach($age as $x => $x_value) {� echo "Key=" . $x . ", Value=" . $x_value;� echo "<br>";�}�?>��</body>�</html>
Key=Pietro, Value=35
Key=Franco, Value=37
Key=Luca, Value=43
PHP: Funzioni
I nomi delle funzioni non sono “case-sensitive.”
PHP: Funzioni
<?php�function setHeight($minheight = 50) {� echo “L’altezza e’ : $minheight <br>";�}��setHeight(350);�setHeight(); // Usa il valore di default e’ 50�setHeight(135);�setHeight(80);�?>
PHP: classi
PHP: classi
Proprietà e metodi possono essere public, protected o private
Stesso significato di Java/C++:
PHP: classi
Per le proprietà, non si specifica il $ dopo ->, a meno di voler accedere a una proprietà il cui nome è contenuto in una variabile:
$prop = ‘id’;
$this->$prop = 1; // Equivale a $this->id = 1
$this all’interno di un metodo identifica l’oggetto su cui il metodo è chiamato
Per accedere a una proprietà o ad un metodo tramite $this si usa la sintassi -> (come per i puntatori in C)
PHP: creazione oggetti
Se non è necessario passare parametri al costruttore, le parentesi possono essere omesse
PHP: creazione oggetti
Il nome della classe può essere contenuto in una variabile, per creare oggetti di un tipo definito dinamicamente
PHP: ereditarieta’
Una classe può ereditare proprietà e metodi di un’altra classe tramite la parola chiave extends
PHP: ereditarieta’
Dichiarazione della classe derivata
Nota: PHP non supporta ereditarietà multipla
PHP: ereditarieta’
Overriding della funzione:
ridefinisco un metodo della classe base
PHP: ereditarieta’
Tramite parent:: è possibile accedere alle proprietà/metodi overidden della classe base
PHP: costruttori e distruttori
PHP: costruttori e distruttori
PHP: autoload
PHP: autoload
Funzione per il supporto all’autoload
PHP: autoload
Tradotto: «Quando uno script cerca di istanziare una classe indefinita $class_name, carica il file $class_name. ‘.php’
PHP: autoload
In questo caso, carica MyClass1.php
In quest’altro, carica MyClass2.php