Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Utilizzare PHP 4 e PHP 5 in modalità concorrente con Apache 2

PHP 4 terminerà la sua gloriosa vita il prossimo 31 dicembre. Prima di passare in produzione il successore (PHP 5) è bene testare quest'ultimo in concomitanza con PHP 4. Ecco come fare usando PHP 4 in modalità CGI
PHP 4 terminerà la sua gloriosa vita il prossimo 31 dicembre. Prima di passare in produzione il successore (PHP 5) è bene testare quest'ultimo in concomitanza con PHP 4. Ecco come fare usando PHP 4 in modalità CGI
Link copiato negli appunti

Ebbene sì, la tanto annunciata morte di PHP4 è ormai alle porte. La "End of Life" è stata fissata per lo scorso 31 dicembre. Dopo questa data potremo contare solo sulle patch di sicurezza, ma anche queste fino ad agosto 2008 e non oltre. Come succede sovente, al reiterato annuncio della prossima fine, in molti hanno risposto "mo' me lo segno" come Massimo Troisi in "Non ci resta che piangere" e poi l'hanno relegato in un angolo della propria memoria.

A parte la battuta non tutti avranno diligentemente aggiornato il proprio codice anche se PHP5 è stabile da un pezzo e si parla già di PHP6. Le motivazioni possono essere varie e sicuramente buone, ma ora siamo di fronte al problema. Codice non compatibile con PHP5 non ha futuro, quindi sui nostri server dovrà girare tale versione del linguaggio. Ma in tal caso è possibile evitare notti insonni a sistemare il codice più datato e programmare la transizione con maggiore calma? Naturalmente si. Anzi il discorso ha molto del déjà vu. Ricordate il rilascio di PHP5? In quell'occasione comparvero in rete numerosi tutorial che spiegavano come provare la versione 5 mantenendo l'installazione di PHP4 sulla propria macchina. Anche HTML.it contribuì con un articolo in proposito. Basterà invertire i termini del problema scambiando PHP4 con PHP5 e avremo la soluzione in tasca.

Forse sarebbe meglio dire le soluzioni, in quanto la documentazione reperibile presenta diversi approcci risolutivi ciascuno con i propri pro ed i propri contro. In questo e in un prossimo articolo analizzeremo due modi diversi di affrontare il problema.

PHP5 come modulo di Apache e PHP4 come CGI

La soluzione che presenterò di seguito permette di utilizzare PHP5 come modulo di Apache ed eseguire PHP4 come cgi (o fastcgi). Rispetto ad altre similari ha il vantaggio di non richiedere la modifica dell'estensione da .php a .php4 per distinguere quali script eseguire con la versione 4 e quali con la 5. Inoltre non comporta l'utilizzo di porte diverse dall'80. È forse la soluzione più indolore e meno onerosa dal punto di vista delle configurazioni, specie per alcune distribuzioni.

Supponiamo di partire da un'installazione standard di Fedora 7 con Apache 2.2.6 e PHP 5.2.2 installati da pacchetti precompilati ed il linguaggio funzionante come modulo del web server. In tal caso la direttiva presente nel file di configurazione /etc/httpd/conf/httpd.conf:

Include conf.d/*.conf

provvederà ad includere (tra gli altri) il file php.conf contenente l'istruzione necessaria al caricamento del modulo PHP5:

LoadModule php5_module modules/libphp5.so

Mentre altre direttive al suo interno indicano all'interprete PHP5 di gestire i file con estensione .php:

AddHandler php5-script .php
AddType text/html .php  

Abbiamo detto che vogliamo utilizzare PHP4 come cgi: con Fedora 7 non possiamo, purtroppo, contare su un pacchetto php-cgi versione 4, salvo non lo troviate in qualche repository particolare.

Con altre distribuzioni potreste avere maggiore fortuna. Se usate, ad esempio, Ubuntu 7.04 Feisty potete trovare in rete chi ha costruito i pacchetti ad-hoc per questa versione. C'è anche chi ha utilizzato i pacchetti esistenti per la precedente Edgy, senza evidenziare problemi di sorta. Nel nostro caso non ci resta che procedere all'installazione dai sorgenti.

Compiliamo PHP4-CGI

Andiamo a prelevare il file php-4.4.7.tar.gz dalla pagina di download ufficiale.

Ora assumiamo i privilegi di root e rimbocchiamoci le maniche. Innanzitutto scompattiamo il file appena prelevato ad esempio in /usr/local/src/, ottenendo la directory /usr/local/src/php-4.4.7. Poiché conviene tenere PHP5 e PHP4 distinti, creiamo un'apposita struttura per questa versione del linguaggio:

[root]# mkdir /usr/lib/php4
[root]# mkdir /etc/php4 
[root]# mkdir /usr/lib/php4/libexec

Ora ritorniamo in /usr/local/src/php-4.4.7 e procediamo alla configurazione, primo passo per la compilazione. Nell'esempio seguente ho riportato solo alcune opzioni strettamente necessarie, naturalmente dovrete specificarne altre per il corretto funzionamento dei vostri script, ad esempio il supporto per le librerie GD o MySQL o IMAP. Le opzioni vanno scritte naturalmente tutte su un'unica riga:

[root@]# ./configure --libdir=/usr/lib/php4 
  --with-exec-dir=/usr/lib/php4/libexec 
  --with-config-file-path=/etc/php4/ 
  --includedir=/usr/include/php4 
  --program-suffix=4 --enable-fastcgi

Proseguite con il solito make seguito da make install controllando l'output per eventuali errori. A questo proposito può risultare utile salvare il risultato delle operazioni eseguite in un file anziché a video per una più comoda consultazione. Ad esempio in questo modo:

[root@]# make > make_log 2>&1

Tornando alle opzioni di configurazione con --program-suffix=4 abbiamo richiesto di aggiungere il suffisso "4" ai nomi dei programmi, così da poterli distinguere più facilmente. A questo punto in /usr/local/bin dovremmo avere PHP4 versione cgi, verifichiamolo con il comando:

[root@]# /usr/local/bin/php4 -v

Se la risposta è simile a:

PHP 4.4.7 (cgi-fcgi) (built: Nov  22 2007 20:14:10) 
Copyright (c) 1997-2007 The PHP Group
...................................

allora siamo a buon punto. Con --with-config-file-path abbiamo richiesto che il file di configurazione di PHP4 sia posizionato in /etc/php4 rendendoci indipendenti dal php.ini della versione 5 localizzato di default in /etc. Naturalmente ricordatevi di copiare in /etc/php4 il file /usr/local/src/php-4.4.7/php.ini-dist rinominandolo php.ini. Passiamo alla configurazione degli host virtuali.

A questo punto, immaginando che la nostra macchina gestisca il dominio mioserver.it, come test configuriamo due host virtuali: uno per l'esecuzione di script PHP5 che chiameremo php5.mioserver.it, ed uno per PHP4 che chiameremo php4.mioserver.it. Le direttive riportate all'interno dei contenitori <VirtualHost> sono solo quelle essenziali al nostro esempio, come lasciano intuire i puntini di sospensione:

NameVirtualHost *:80 

# Configurazione per PHP5
<VirtualHost *:80>  
ServerName php5.mioserver.it
DocumentRoot /var/www/html/php5
DirectoryIndex index.php index.html index.htm 
.....................
</VirtualHost> 

# Configurazione per PHP4
<VirtualHost *:80>  
ServerName php4.mioserver.it 
DocumentRoot /var/www/html/php4
DirectoryIndex index.php index.html index.htm 
SetEnv PHPRC /etc/php4 
ScriptAlias /cgi-bin/ /usr/local/bin/
Action php4-script /cgi-bin/php4
AddHandler php4-script .php 
.....................
</VirtualHost>

Abbiamo supposto di posizionare la Document Root degli host virtuali nelle directory php5 e php4 appositamente create in /var/www/html, ovviamente dovrete adattare le direttive alla struttura del vostro web server. Ora inseriamo all'interno di entrambe un file index.php il cui contenuto sarà semplicemente:

<? phpinfo() ?>

Esso ha lo scopo d'individuare quale versione di php risulti disponibile all'interno del virtual host richiesto e quali ne siano le caratteristiche.

Puntiamo il nostro browser su http://php4.miosito.it e, se tutto funziona correttamente, otterremo la pagina informativa di PHP Versione 4.4.7. Al contrario, digitando http://php5.miosito.it, dovremmo ottenere la pagina informativa di PHP Versione 5.2.2 o successiva, se avete provveduto ad aggiornarla.

Analizzando la voce Server Api nel primo caso leggeremo CGI/FastCGI nel secondo Apache 2.0 Handler. Mentre alla voce Loaded Configuration File leggeremo /etc/php4/php.ini per PHP4 ed /etc/php.ini nel caso di PHP5.

A questo punto non ci resta che adottare la configurazione adeguata sito per sito a seconda della compatibilità o meno del codice con la versione più recente del linguaggio.

Conclusioni

Abbiamo visto come sia possibile far funzionare in modalità concorrente PHP4 e PHP5 con Apache 2. La soluzione presentata ovviamente non è unica, ma una tra le tante. È semplicemente quella che, a mio parere, risulta più veloce e più facile da implementare. A questo proposito devo anche notare che l'ho testata su macchine di sviluppo e non di produzione non avendone per ora la necessità. Quello che ho descritto, come si suol dire, works just fine for me. Quindi fate bene i vostri test sia per quanto riguarda le prestazioni sia per ciò che riguarda la sicurezza nell'esecuzione di PHP come CGI (ricordo l'opzione --enable-force-cgi-redirect).

Vi lascio dandovi appuntamento al prossimo articolo dove vedremo una soluzione alternativa, un po' più laboriosa, che consiste nell'eseguire contemporaneamente più istanze del web server Apache.

Ti consigliamo anche