In questi giorni stavo cercando si far convivere PHP4 e PHP5 sulla stessa macchina (distrribuzione Linux Ubuntu Breezy). Ricercando e "googlando" ho trovato 2 soluzioni:
- la prima (90% dei casi) è quella di installare PHP4 o PHP5 come CGI;
- la seconda è quella di installare PHP4 e PHP5 come moduli andando a lanciare poi due processi di apache appositamente configurati;
Per entrambe, ho trovato soluzioni che portavano invariabilmente a dover compilare/ricompilare uno o più pacchetti: php5, apache, php4, e così via. Alla fine però sono riuscito ad installare sia PHP4 che PHP5 senza dover ricompilare o compilare alcunchè!
Sulla mia macchina linux (Ubuntu breezy) avevo già installato Apache2 (apt-get install apache2), avevo già installato php4 (apt-get install php4), avevo già installato mysql (apt-get install mysql) e infine avevo istallato phpmyadmin ( apt-get install phpmyadmin ).
A questo punto ho installato tutti i pacchetti (ad uno ad uno) che servono per far funzionare il php5: (riferimento)
apache2-mpm-prefork libbz2-1.0 libc6 libcomerr2 libdb4.2 libgdbm3 libkrb53 libmagic1 libpcre3 libssl0.9.7 libxml2 mime-support php5-common zlib1g php-pear
Inoltre ho installato anche il pacchetto php5-cgi.
Questo pacchetto lo avevo installato mentre cercavo di far andare il PHP5 come CGI senza doverlo per forza ricompilare! Vi dico che l’ho installato perchè dopo prenderò spunto dal file php.ini delle cartella /etc/php5/cgi/php.ini per scrivere il file php.ini da utilizzare nella nostra installazione.
Una volta installati tutti questi pacchetti mi sono scaricato il file libapache2-mod-php5_5.0.5-2ubuntu1.2_i386.deb da questa pagina.
A questo punto avevo tutto ciò che mi serviva e, sperimentando, sono arrivato ad installare il PHP4 e il PHP5 insieme così: 1) Ho decompresso il file ".deb" in un directory (es. /home/filippo/php5/) :
dpkg -x libapache2-mod-php5_5.0.5-2ubuntu1.2_i386.deb /home/filippo/php5/
2) Entro nella directory /home/filippo/php5/
cd /home/filippo/php5/ )
3) Ho tre file che mi interessano tra quelli appena scompattati, e si trovano in:
usr/lib/apache2/module/libphp5.so etc/apache2/mods-available/php5.conf etc/apache2/mods-available/php5.load;
4) Prima di andare a copiare i file e quindi a configurare apache2 per funzionare con entrambe le versioni di php vado a fare il backup del file di configurazione di apache :
mv /etc/apache2/apache.conf /etc/apache2/apache.conf.original;
5) Una volta fatto questo vado ad eseguire le seguenti operazioni:
5.1) cp /home/filippo/php5/usr/lib/apache2/module/libphp5.so /usr/lib/apache2/modules/ 5.2) cp /home/filippo/php5/etc/apache2/mods-available/php5.conf /etc/apache2/mods-available/ 5.3) cp /home/filippo/php5/etc/apache2/mods-available/php5.load /etc/apache2/mods-available/
A questo punto ho tutti i file che mi servono in posizione, vado quindi a creare il file php.ini per far funzionare il php5:
6) Per creare il file php.ini per il PHP5 mi sono basato sul file presente (dopo aver installato il pacchetto php5-cgi) in /etc/php5/cgi/php.ini, chi è più esperto o ha bisogno di configurazioni paticolari può anche crearselo da zero o modificarlo a piacimento.
L’importante è DOVE andiamo a mettere questo php.ini! Infatti dobbiamo creare la cartella "mkdir /etc/php5/apache2/" e andare a inserire il nostro file php.ini in essa. Inoltre è suggerita l’abilitazione della retro compatibilità di PHP5 per gli script basati su PHP4 e PHP3 settando l’opzione " zend.ze1_compatibility_mode = On".
Ora andiamo a lavorare su apache2 e creiamo i file di configurazione che utilizzeranno i nostri due processi di apache2:
7) cp /etc/apache2/apache2.conf.original /etc/apache2/apache2.php4.conf
cp /etc/apache2/apache2.conf.original /etc/apache2/apache2.php5.conf
9) A questo punto dobbia andare a modificare i file appena creati e lo facciamo come segue: File /etc/apache2/apache2.php4.conf: Alle righe
# Include module configuration: Include /etc/apache2/mods-enabled/*.load Include /etc/apache2/mods-enabled/*.conf
sostituiamo le righe
# Include module configuration: Include /etc/apache2/mods-enabled/cgi.load Include /etc/apache2/mods-enabled/php4.conf Include /etc/apache2/mods-enabled/php4.load Include /etc/apache2/mods-enabled/userdir.conf Include /etc/apache2/mods-enabled/userdir.load
File /etc/apache2/apache2.php5.conf: Alle righe
# Include module configuration: Include /etc/apache2/mods-enabled/*.load Include /etc/apache2/mods-enabled/*.conf
sostituiamo le righe
# Include module configuration: Include /etc/apache2/mods-enabled/cgi.load Include /etc/apache2/mods-enabled/php5.conf Include /etc/apache2/mods-enabled/php5.load Include /etc/apache2/mods-enabled/userdir.conf Include /etc/apache2/mods-enabled/userdir.load
Inoltre andiamo a sostituire alle righe
# PidFile: The file in which the server should record its process # identification number when it starts. PidFile /var/run/apache2.pid
le righe
# PidFile: The file in which the server should record its process # identification number when it starts. PidFile /var/run/apache2.5.pid
e alla riga
# Global error log. ErrorLog /var/log/apache2/error.log
sostituiamo la riga
# Global error log. ErrorLog /var/log/apache2/error5.log
Per ultimo andiamo a sostituire alla riga
# Include ports listing Include /etc/apache2/ports.conf
la riga
# Include ports listing Include /etc/apache2/ports.php5.conf
11) Come avrete notato se eseguite il comando "ls /etc/apache2/mods-enabled/" non vediamo i "file" php5.conf e php5.load, questi sono infatti link che dobbiamo creare con i comandi:
ln -s /etc/apache2/mods-available/php5.conf /etc/apache2/mods-enabled/php5.conf ln -s /etc/apache2/mods-available/php5.load /etc/apache2/mods-enabled/php5.load
Una volta creati i link simbolici, abbiamo un altro dubbio: cosè il file "ports.php5.conf"?
E’ un file che dobbiamo crearci (viene incluso nel file apache2.php5.conf come detto sopra) per indicare ad apache su che porta stare in ascolto delle richieste al web server.
In particolare per quel che riguarda la mia configurazione non ho modificato l’include di ports.conf per il file apache2.php4.conf e quindi quel servizio utilizzerà la porta 80 (default) mentre ho creato come segue il file ports.php5.conf:
cp /etc/apache2/ports.conf /etc/apache2/ports.php5.conf
Modifico ora il file ports.php5.conf andando ad aggiornare il numero di porta su cui voglio che il processo di apache che sfrutta PHP5 stia in ascolto.
Nel mio caso ho scelto la porta 8082: basta cancelare tutto quello che c’è scritto nel file e scrivere nel file "Listen 8082".
Fatto questo siamo apposto e possiamo sperimentare se il nostro lavoro ha dato esito positivo: apriamo una shell, per eseguire il webserver con PHP4 lanciamo il comando "apache2 -f /etc/apache2/apache2.php4.conf", per eseguire il webserver con il PHP5 lanciamo "apache2 -f /etc/apache2/apache2.php5.conf".
Magari per sperimentare se tutto va bene creiamo la solita pagina "info" di php:
Apriamo il file /var/ww/info.php (se non c’è createlo), ci scriviamo dentro "< ? php phpinfo(); ? >".
Una volta creato il file e avviati i nostri due processi andiamo a collegarci con il browser alla pagina http://localhost/info.php e alla pagina http://localhost:8082/info.php e dovremmo ottenere una schermata come questa:
Vi lascio poi il link ai file che io ho creato per la mia configurazione, potete scaricarli da qui. Inoltre vi lascio dei riferimenti a pagine web che mi hanno dato più o meno una mano: howtoforge debianhelp my.opera.com html.it
[UPDATE per il modulo di mysql]
Visto che il php5 non dispone del modulo di mysql in automatico (come mi faceva notare Ciccio, che ringrazio), se lo vogliamo, dobbiamo effettuaare ulteriori operazioni. 1) scarichiamo da qui il pacchetto php5-mysql; 2) scompattiamolo alla solita maniera :
dpkg -x php5-mysql_5.0.5-2ubuntu1.2_i386.deb /cartella/scelta/
3) copiamo il file mysql.so:
cp /cartella/scelta/usr/lib/php5/20041030/mysql.so /usr/lib/php5/20041030/
4) modifichiamo il file php.ini (vi /etc/php5/apache2/php.ini) Da così:
;;;;;;;;;;;;;;;;;;;;;; ; Dynamic Extensions ; ;;;;;;;;;;;;;;;;;;;;;; ; [...] ; Example lines: ;extension=mysql.so ;extension=gd.so [...]
A così:
;;;;;;;;;;;;;;;;;;;;;; ; Dynamic Extensions ; ;;;;;;;;;;;;;;;;;;;;;; ; [...] ; Example lines: extension=mysql.so ;extension=gd.so [...]
Riavviamo apache (sempre con il comando "apache" e specificando il file di configurazione con il modulo php5) e siamo apposto!
Posted under Linguaggi di Programmazione, Linux, PHP
This post was written by Filippo on April 27, 2006


Complimenti!
Geniale….
Solo una domanda…. Come posso poi fare i vari /etc/init.d/apache stop|start|restart e compagnia bella?
Ora mi da errore:
root@cubax:/home/ale# /etc/init.d/apache2 stop
* Stopping apache 2.0 web server… awk: cannot open /etc/apache2/apache2.conf (No such file or directory)
grep: /etc/apache2/apache2.conf: Nessun file o directory
Non ho guardato come fare i comandi direttamente da /etc/init.d/, in effetti per fermare il server solitamente lo “killo”, nel senso che uso il comando kil.
Per lanciare (start) uso “apache2 -f /etc/apache2/apache2.php4.conf” o “apache2 -f /etc/apache2/apache2.php5.conf”. Per fermarlo (stop) mi sa che c’era qualche dritta sui link segnalati
Ok, killall -9 apache2 risolve il problema del riavvio del server.
Altro problemino:
Non riesco a far vedere a PHP5 la libreria mysql.
Da quanto è stato scritto questo howto i .deb sono cambiati… e’ alcune versioni sono cambiate, non più disponibili…..
Infatti, scompattando il .deb di mysql, i lpercorso creato è /usr/lib/php5/20051025
Come faccio a verificare quale deve essere la corretta posizione del mysql.so per la mia versione di php5?
(Il php.ini ha decommentato correttamente la riga….)
Grazie!!
Penso che l’unica cosa che devi modificare è la cartella con nome numerico, il percorso dovrebbe essere sempre lo stesso. Cioè passi da
a
Penso che sia così ma non ho provato, appena posso sperimento e ti faccio sapere. Se lo provi prima tu avvisami
Avevo già provato… Ora li ho in entrambe le posizioni:
/usr/lib/php5/20041030/mysql.so
/usr/lib/php5/20051025/mysql.so
…. Nel php.ini ho questo:
extension=mysql.so
Non so piu’ che guardare…..
alessandro, sei sicuro di utilizzare il php.ini che modifichi? hai provato a vedere la posizione del file nel report di phpinfo() ?
ottime dritte, filippo; unico suggerimento a livello di dettaglio, nei nuovi file di configurazione metterei, per essere più generico:
(/etc/apache2/apache2.php4.conf)
# Include module configuration
Include /etc/apache2/mods-enabled/[^php5]*
(/etc/apache2/apache2.php5.conf)
# Include module configuration
Include /etc/apache2/mods-enabled/[^php4]*
Grazie mille,ottima guida
Prego
Ciao, con apt-get install php4 non mi trova il pacchetto perchè dice che è obsoleto, come faccio? Devo cambiare i repository? Ho Ubuntu 7.10 con Apache2 e php5.
Grazie
mmm… è una bella domanda.
Così a prima pensata mi verrebbe in mente che l’unica maniera di installare php4 è compilarselo.
tipo scaricarlo dal sito e ricompilarlo sotto la tua ubuntu magari cercando di fare quello che ho fatto io con php5.
Mi dispiace non saperti dire di più, io ora se faccio qualcosa in php lo faccio con il 5
Se più avanti proverò a farli funzionare insieme ancora ti faccio sapere!
Anche io ho lo stesso problema con php4, nessuno ha trovato un’altra soluzione oltre a compilarlo?
Grazie!