Context engineering
Scopo del modulo: introdurre gli studenti a PHP come linguaggio lato server, farli installare e configurare un ambiente locale (XAMPP / LAMP / MAMP), eseguire il primo script <?php echo "Hello World"; ?>, capire come funziona il server locale e sperimentare la shell/CLI di PHP. Alla fine del modulo ogni partecipante dovrà saper creare ed eseguire un file PHP, conoscere il ciclo richiesta-risposta e le basi di sicurezza per l’ambiente di sviluppo.
Al termine delle 2 ore lo studente sarà in grado di:
Riassumere cos’è PHP e dove viene utilizzato (web back-end, API, scripting CLI, generazione HTML).
Installare e avviare un ambiente locale basato su XAMPP / LAMP / MAMP e individuare la document root.
Creare ed eseguire uno script PHP di base (index.php) via server locale e via server integrato (php -S).
Spiegare il ciclo richiesta → esecuzione PHP → risposta HTTP e la differenza tra mod_php, PHP-FPM e PHP CLI.
Usare phpinfo() per verificare la versione e le estensioni; configurare le impostazioni principali in php.ini per sviluppo.
Eseguire semplici operazioni di input (form html) e stampa in modo sicuro (sanitizzazione base).
Introduzione e panoramica su PHP — 10′
Installazione e panoramica ambienti (XAMPP / LAMP / MAMP) — 25′
Primo script & esecuzione (index.php) — 15′
Ciclo server / request → response; mod_php vs PHP-FPM; phpinfo() — 20′
Esempio pratico: form POST e sanitizzazione — 20′
CLI PHP, server incorporato php -S, troubleshooting — 15′
Q&A e compiti — 15′
PHP è un linguaggio di scripting interpretato pensato originariamente per la generazione dinamica di pagine web lato server. Oggi è ampiamente usato per applicazioni web (WordPress, Drupal, Laravel, Symfony), API REST, automazioni CLI e generazione di contenuti dinamici.
Vantaggi: ampia diffusione, librerie mature, integrazione nativa con MySQL/MariaDB, ampia comunità.
Limiti/attenzioni: prestazioni dipendono dalla versione (usare PHP 8+ quando possibile), attenzione alla sicurezza e alle configurazioni di produzione.
Nota: XAMPP, LAMP e MAMP sono pacchetti “stack” che includono web server (Apache o Nginx), PHP e database (MySQL/MariaDB). Scegliere lo strumento in base al sistema operativo e alla preferenza didattica.
Scaricare XAMPP dal sito ufficiale e installare (installer grafico).
Avviare il Control Panel (Windows/macOS) e far partire Apache (ed eventualmente MySQL/MariaDB).
Document root predefinita:
Windows: C:\xampp\htdocs\
macOS (XAMPP): /Applications/XAMPP/htdocs/
Linux (XAMPP): /opt/lampp/htdocs/
Posizionare index.php dentro la document root e aprire http://localhost/index.php nel browser.
Per comandi su Linux XAMPP: sudo /opt/lampp/lampp start / stop / restart.
Su Debian/Ubuntu (esempio):
sudo apt updatesudo apt install apache2 php libapache2-mod-php mysql-server# abilitare il modulo PHP per Apache (di solito libapache2-mod-php lo fa)sudo systemctl start apache2
Document root tipico: /var/www/html/
File PHP in /var/www/html/index.php → http://localhost/
Scaricare MAMP; avviarlo; document root: /Applications/MAMP/htdocs/ (configurabile via interfaccia).
Avviare Apache & MySQL dal pannello MAMP. Aprire http://localhost:8888/ (porta predefinita MAMP) o http://localhost/ se configurata diversamente.
Se si usa /var/www/html, evitare di lavorare come root; cambiare proprietario del progetto o usare gruppi:
sudo chown -R $USER:www-data /var/www/html/tuo_progettosudo chmod -R 755 /var/www/html/tuo_progetto
Passi rapidi:
Creare file index.php nella document root:
<?phpecho "Hello World";
Aprire nel browser: http://localhost/index.php → dovrebbe mostrare Hello World.
Nota: evitare i short tags <? perché potrebbero essere disabilitati; usare sempre <?php.
Esempio con HTML:
<!doctype html><html><head><meta charset="utf-8"><title>Hello</title></head><body><?php echo "<h1>Hello World</h1>"; ?></body></html>
Il browser invia una richiesta HTTP (GET/POST) al server (http://localhost/path).
Il server web (Apache/Nginx) riceve la richiesta.
Se la risorsa è un file statico (.html, .css, .jpg), il server lo restituisce direttamente.
Se la risorsa è un file PHP, il server passa la richiesta all’interprete PHP (tramite modulo mod_php in Apache oppure tramite PHP-FPM + FastCGI se configurato con Nginx o Apache + proxy).
L’interprete PHP esegue lo script: legge codice PHP, esegue logica, accede alle risorse (DB, file), genera output (tipicamente HTML o JSON).
Il server riceve l’output (stdout) da PHP e lo invia come risposta HTTP al browser.
Il browser visualizza il contenuto restituito.
mod_php (Apache module): PHP è caricato direttamente come modulo Apache; semplice per sviluppo, meno efficiente in scenari con worker multipli.
PHP-FPM (FastCGI Process Manager): PHP gira in processi separati e il webserver invia le richieste ad essi; più moderno e performante in produzione.
PHP CLI: linea di comando (php script.php) per script non-web (cron, tool).
phpinfo()Creare info.php:
<?phpphpinfo();
Aprire http://localhost/info.php per vedere versione PHP, estensioni attive, php.ini caricato, variabili d’ambiente.
php.ini, error reporting)File di configurazione: php.ini (posizione indicata in phpinfo()).
Per ambiente di sviluppo:
display_errors = On
error_reporting = E_ALL
display_startup_errors = On
In produzione disabilitare display_errors e loggare gli errori invece in file: log_errors = On e error_log = /path/to/php-error.log.
IMPORTANTE: Non lasciare
display_errors = Onin server esposti pubblicamente — può rivelare percorsi o credenziali.
form.php
<!doctype html><html><head><meta charset="utf-8"><title>Saluto</title></head><body><form method="post" action=""><label>Nome: <input type="text" name="name"></label><button type="submit">Invia</button></form><?phpif ($_SERVER['REQUEST_METHOD'] === 'POST') {// usare filter_input per sicurezza$name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_SPECIAL_CHARS);if ($name === null || $name === '') {echo "<p style='color:orange'>Inserisci un nome valido.</p>";} else {// escapiamo sempre l'output per prevenire XSSecho "<p>Ciao, " . htmlspecialchars($name, ENT_QUOTES, 'UTF-8') . "!</p>";}}?></body></html>
Punti didattici:
$_POST/$_GET/$_REQUEST sono superglobali: spiegare differenze.
Sanitizzazione: filter_input, htmlspecialchars() per output, prepared statements per DB (vedi nota sicurezze).
Validazione vs. sanitizzazione: validare i dati (es. filter_var($email, FILTER_VALIDATE_EMAIL)) prima di usarli.
Eseguire script PHP dalla riga di comando:
php script.php
Server HTTP integrato (solo per sviluppo): posizionarsi nella cartella del progetto e:
php -S localhost:8000
Poi aprire http://localhost:8000/ — comodo per testare senza configurare Apache/Nginx. Per usare router personalizzato:
php -S localhost:8000 router.php
Connessione sicura con PDO e prepared statements:
<?php$dsn = 'mysql:host=127.0.0.1;dbname=testdb;charset=utf8mb4';$user = 'root';$pass = ''; // in XAMPP/MAMP default password vuota per root$options = [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,];try {$pdo = new PDO($dsn, $user, $pass, $options);} catch (PDOException $e) {die("Connessione fallita: " . $e->getMessage());}$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email');$stmt->execute(['email' => 'test@example.com']);$user = $stmt->fetch();
Indicazioni: usare variabili d’ambiente o file di configurazione sicuro per credenziali (non commit su git).
Non esporre XAMPP/MAMP ad Internet senza protezioni. Ambiente locale = solo localhost per sviluppo.
Non lasciare display_errors = On in produzione.
Usare prepared statements per tutte le query SQL (evita SQL injection).
Validare e sanitizzare input.
Limitare file upload (dimensione, tipologie) e salvare fuori dalla document root quando possibile.
Non immettere credenziali in chiaro nel repo: usare .env o variabili d’ambiente e assicurarsi che .env sia in .gitignore.
Esercizio A — Hello World
Creare index.php con echo "Hello World"; ed eseguirlo da server locale.
Esercizio B — Form + validazione
Creare form.php come sopra; aggiungere validazione su lunghezza del nome (min 2, max 50).
Esercizio C — Server incorporato
Avviare php -S localhost:8000 nella cartella del progetto e testare la stessa app senza XAMPP.
Esercizio D — Infopage
Creare info.php con phpinfo(); ed individuare:
percorso php.ini
versione PHP
estensioni caricate (PDO, mbstring, openssl)
Esercizio E — Connessione DB (opzionale, avanzato)
Creare database testdb, tabella users (id, name, email), inserire 2 righe e leggere i dati con PDO (prepared statement).
Pagina PHP visualizza il codice sorgente → probabilmente il file non è servito da un server PHP (stai aprendo file:// invece di http://localhost/) o PHP non è abilitato nel server.
Pagina bianca / 500 Internal Server Error → controllare error_log di Apache e php_error.log; abilitare display_errors in dev.
Short tags <? non funzionano → abilitare short_open_tag in php.ini (meglio: usare <?php).
Permessi file (403 Forbidden) → verificare permessi e proprietà del file webserver.
MySQL access denied → controllare user/password e host (soprattutto 127.0.0.1 vs localhost).
Estensioni mancanti (es. pdo_mysql) → abilitare estensione in php.ini o installarla (es. sudo apt install php-mysql).
Installazione e ambiente (30%): XAMPP/LAMP/MAMP installato, Apache avviato, file in document root.
Primo script (20%): index.php eseguito correttamente nel browser.
Comprensione server flow (20%): spiegazione chiara del ciclo request → PHP → response e differenze mod_php/PHP-FPM.
Esercizi (20%): form funzionante con sanitizzazione; uso php -S o phpinfo().
Documentazione e sicurezza (10%): breve README con info su come avviare il progetto e note di sicurezza.
Percorsi document root (tipici)
XAMPP Windows: C:\xampp\htdocs\
XAMPP macOS: /Applications/XAMPP/htdocs/
XAMPP Linux: /opt/lampp/htdocs/
LAMP (Ubuntu): /var/www/html/
MAMP: /Applications/MAMP/htdocs/
Comandi rapidi
# avviare server integrato (dev)php -S localhost:8000# eseguire script CLIphp script.php# avviare XAMPP (Linux)sudo /opt/lampp/lampp start# systemd (Apache on Ubuntu)sudo systemctl start apache2sudo systemctl status apache2# visualizzare versione PHPphp --version# cercare php.ini con phpinfo() oppure:php -i | grep "Loaded Configuration File"
php.ini — impostazioni utili (dev)
display_errors = Onerror_reporting = E_ALLdisplay_startup_errors = Onlog_errors = Onerror_log = /path/to/php-error.log
Manuale ufficiale PHP — php.net (documentazione, funzioni, security).
Documentazione XAMPP / MAMP / Apache / Nginx (siti ufficiali).
Introduzioni su PDO, prepared statements e sicurezza SQL (manuale PHP).
Tutorial ufficiali (W3Schools, MDN-like resources) e corsi base.
Commenti
Posta un commento