Il primo programma in PHP

Ricordo ancora il giorno in cui decisi di imparare il PHP. Scrivere il primo programma fu semplice, sul web c'erano molti esempi, ma non avevo la minima idea di cosa volesse dire programmazione server-side, e le informazioni, più o meno confuse, trovate su Internet non mi aiutavano a dissipare un dubbio piuttosto importante: come faccio ad eseguire un programma PHP?

Programmazione server-side

Un utente abituato a utilizzare i linguaggi di programmazione "classici" (C, Java, Pascal), quando si avvicina ad un nuovo linguaggio, probabilmente si aspetta di doversi procurare un compilatore o, al massimo, un interprete, che renda eseguibile il codice sorgente. In PHP non esiste niente di tutto questo.

PHP (originariamente Personal Home Page) è un linguaggio nato per il web, e qui sta la prima particolarità: dove i programmi tradizionali comunicano con l'utente attraverso l'interfaccia del sistema operativo (le finestre, o il terminale), PHP si esprime attraverso le pagine web. In pratica, dove un linguaggio come, ad esempio, il C scrive il testo direttamente sul terminale, uno script PHP scrive il testo su una pagina web, che sarà poi visualizzata dall'utente attraverso il browser.

I più attenti avranno sicuramente notato che molti indirizzi internet non puntano a pagine HTML, ma PHP (effettivamente basta alzare di poco lo sguardo su questa pagina ;) ). A questo punto si potrebbe essere portati a credere che sia il browser ad interpretare il codice PHP delle pagine, ma (attenzione!) questo non è vero.

È vero che il compito di PHP è produrre del codice HTML, che sarà visualizzato da un browser, ma manca a questo punto un attore in gioco, che si deve occupare di prendere il codice PHP, interpretarlo, eseguirlo, produrre la pagina HTML e inviarla al browser. Questo attore è il webserver.

Server-Client

Il concetto nuovo che andremo ad introdurre è il rapporto tra questo soggetto, per ora misterioso, il server, e l'utente che, attraverso il client, lo interroga.

Per i più impazienti preciso che l'obbiettivo sarà quello di trasformare il proprio computer in un server web, che sia in grado di "servire" le pagine PHP agli utenti, ovvero, in questo caso, noi stessi che vogliamo testare i nostri programmi.

Immaginiamo di prendere un caffè al bar. Entriamo, chiediamo il caffè al barista, beviamo il caffè che ci viene servito, paghiamo e usciamo. Quando chiediamo una pagina PHP (ad esempio supponiamo di richiedere la pagina http://repni.altervista.org/index.php) ad un server web, la procedura seguita è simile:

  1. Si invia, attraverso il browser, la richiesta della pagina index.php al server repni.altervista.org.
  2. Il server riceve la richiesta ed esegue il codice contenuto nel file index.php.
  3. Il codice ha l'effetto di produrre una pagina HTML, che il server provvederà ad inviare al client che l'ha richiesta.
  4. Il client (ovvero il browser) riceve la pagina e la mostra all'utente come farebbe con una qualsiasi pagina HTML.

È chiara allora la natura dei programmi PHP: sono fatti per essere eseguiti su una macchina apposta, detta server, che ne invia il risultato (sotto forma di pagina web) al computer dell'utente, il client.

Installare APACHE e PHP

Questa cosa sembrerebbe molto scoraggiante: vuol dire che per provare i miei programmi devo mettermi in casa un server web?

La risposta è... Sì, ma probabilmente ne hai già uno: è il solito computer che usi tutti i giorni.

Mi spiego meglio: in realtà non è strettamente necessario chiedere le pagine ad una macchina esterna, attraverso Internet (che comunque è l'utilizzo per cui è stato pensato il PHP), ma è possibile "istruire" il PC di casa in modo che sia in grado di rispondere e gestire le richieste di pagine PHP. Fatto questo sarà sufficiente inoltrare le richieste delle pagine alla nostra stessa macchina. Come? Abbi pazienza: andiamo con ordine e trasformiamo prima la macchina in un webserver.

Da questo momento, con server web intendo un software eseguito in background dalla macchina, che si occupa di gestire richieste di pagine web. I principali concorrenti nel mercato dei webservers sono Microsoft IIS, integrato nelle versioni server di Windows, e Apache, sviluppato comunitariamente, e al momento più utilizzato di IIS.

Apache

Apache si trova nei repositories di praticamente ogni distribuzione Linux; in particolare, il nome del pacchetto è generalmente httpd (HTTP Daemon). Possiamo installarlo via interfaccia grafica:

Installazione di Apache

Una volta installato, Apache mette a disposizione del sistema un nuovo servizio: httpd. Possiamo avviarlo attraverso l'interfaccia grafica (cliccando Enable si abilita l'avvio automatico del server con l'accensione del computer):

Sistema > Amministrazione > Servizi

O utilizzando il terminale (è necessario autenticarsi come root; gli utenti Ubuntu, che non usano l'utente root, possono usare sudo bash al posto di su):

[repni@localhost ~]$ su
Password:
[root@localhost repni]# /etc/init.d/httpd start
Starting httpd:                                            [  OK  ]
[root@localhost repni]#

Il comando da impartire al terminale per abilitare automaticamente Apache all'avvio del computer è chkconfig --level 2345 httpd on (chkconfig --list per elencare tutti i servizi). Non è consigliabile farlo, perchè il server consuma risorse e può mettere a rischio la sicurezza della macchina, se il computer è connesso a Internet; tuttavia può essere utile se si ha intenzione di usarlo tutti i giorni e non si vuole avviarlo manualmente ogni volta.

A questo punto la nostra linux-box è a tutti gli effetti un webserver. Possiamo verificarlo accedendo, con un browser web, alla pagina http://localhost/ (o http://127.0.0.1/):

Proviamo il webserver appena installato

È successo esattamente quello che succede quando si digita un indirizzo Internet, solo che stavolta a rispondere non è un server sulla rete, ma il nostro stesso computer. localhost è infatti il nome che il sistema assegna al computer stesso, e l'indirizzo corrispondente è 127.0.0.1, che viene detto, appunto, loopback address.

Usare Apache

È d'uopo spendere due parole sull'uso del server.

La cosa più semplice da fare è personalizzare la pagina principale servita da Apache (quella che si è aperta visitando http://localhost/). Questa pagina viene servita quando non è stata caricata la pagina principale da servire, infatti la cartella /var/www/html, che contiene le pagine da servire, è vuota. Notiamo anche una cosa fastidiosa: dentro questa cartella non è possibile creare files e cartelle, perchè è di proprietà dell'utente root:

la cartella /var/www/html è vuota Il proprietario di /var/www/html è root

Come sappiamo, in Unix (e Linux di conseguenza), files e cartelle hanno un proprietario, che può scegliere se consentire o meno l'accesso ai suoi files. Il motivo per cui non si riesce a scrivere nella cartella è che essa è di proprietà di root (l'amministratore del sistema), il quale non consente agli altri l'accesso in scrittura.

La cosa più veloce da fare sarebbe modificare i permessi della cartella, permettendo la scrittura a tutti gli utenti. Questa mossa è però molto irresponsabile: così facendo si mette a serio rischio la sicurezza del server web.

Ci sarebbero molte altre soluzioni più veloci, ma cerchiamo di fare le cose con un po' più di stile: una buona soluzione è creare un gruppo di utenti che abbiano permessi di scrittura in /var/www/html, ed inserire il nostro utente in questo gruppo.

In realtà Apache, durante l'installazione, crea da solo un utente ed un gruppo apposta per le operazioni web. A noi interessa il gruppo; cercando all'interno del file /etc/group (cat /etc/group per mostrare il contenuto; cat /etc/group | sort per mostrarlo in ordine alfabetico), che contiene l'elenco di tutti i gruppi nel sistema, possiamo capire qual'è. Su Fedora 11, la distribuzione che sto utilizzando, questo gruppo si chiama apache; sulle altre distribuzioni può avere altri nomi, ad esempio su Debian e Ubuntu il gruppo predefinito è www-data.

Trovato il nome del gruppo, passiamo a modificare il gruppo della cartella /var/www/html (ricordo che gli utenti Ubuntu devono usare sudo bash al posto di su):

[repni@localhost ~]$ su
Password: 
[root@localhost repni]# cd /var/www/
[root@localhost www]# chgrp apache html/
[root@localhost www]# 

Verifichiamo che l'operazione sia andata a buon fine elencando i files:

[root@localhost www]# ls -l
total 16
drwxr-xr-x  2 root  root   4096 2010-04-07 00:31 cgi-bin
drwxr-xr-x  3 root  root   4096 2010-05-14 13:29 error
drwxr-xr-x  2 root  apache 4096 2010-04-07 00:31 html
drwxr-xr-x  3 root  root   4096 2010-05-14 13:29 icons
[root@localhost www]# 

Ora impostiamo i permessi, sempre da root, in modo che i membri del gruppo possano scrivere in /var/www/html:

[root@localhost www]# chmod g+w html/
[root@localhost www]# 

Non resta che aggiungere il nostro utente (nel mio caso il nome utente è repni) al gruppo apache (o www-data, o comunque quello che abbiamo trovato prima). Possiamo farlo attraverso l'interfaccia grafica, oppure, da bravi pinguini, continuare ad utilizzare il terminale (sempre da root):

[root@localhost www]# gpasswd -a repni apache
Adding user repni to group apache
[root@localhost www]# 

È importante terminare la sessione ed effettuare nuovamente il log-in per applicare le modifiche al gruppo, dopodichè finalmente si avrà accesso in scrittura alla cartella /var/www/html:

Accesso in scrittura su /var/www/html!

Come prima operazione creiamo il file principale: index.html, scrivendoci dentro qualcosa a piacere:

Perfetto, non resta che provare se tutto ha funzionato correttamente, navigando in http://localhost/:

Funziona!

PHP

Il lavoro da fare però non è finito: al momento il nostro Apache è in grado di servire le normali pagine HTML, ma non ha idea di come interpretare gli script PHP. Possiamo facilmente verificare questo fatto creando in /var/www/html un semplice script php (script.php) che andremo a visitare all'indirizzo /var/www/html/index.php:

Apache non sa interpretare il codice PHP

Quello che manca è un modulo di Apache che interpreti ed esegua il codice php. Il pacchetto che abbiamo bisogno di installare si chiama proprio php:

Riavviamo Apache...

[repni@localhost ~]$ su
Password: 
[root@localhost repni]# /etc/init.d/hhtpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]
[root@localhost repni]# 

...e...

Apache esegue lo script PHP!

Chi fosse curioso, potrebbe verificare l'abilitazione del modulo PHP dal terminale, impartendo /usr/sbin/httpd -M

Direi che abbiamo raggiunto il nostro scopo, ora non resta che buttarsi nell'apprendimento del PHP, del quale, con un po' di fortuna, vedremo presto una guida su queste pagine :)

In bocca al lupo!