Introduzione
In questo articolo esamineremo le difficoltà a cui potrebbe andare incontro chi, senza abbandonare il collaudato PHP 4, voglia installare e testare su server Windows anche PHP 5, appena rilasciato dal team di sviluppo e scaricabile presso http://www.php.net/downloads.php.
Le versioni prese in considerazione sono rispettivamente la 4.3.6 per PHP 4 e la 5.0.0RC1 per PHP 5 (l' installazione è valida anche per la versione definitiva della 5). Il webserver utilizzato per entrambe le versioni è Apache 1.3.29, ma accenneremo anche all'installazione su IIS (Internet Information Service) e Apache 2, il tutto è stato testato con Windows 2000 SP4 aggiornato a fine aprile 2004 (le procedure saranno comunque valide anche per la versione XP di Windows).
Da dove cominciare
Per installare PHP 4 come modulo (cioè integrandolo nel webserver) è necessario prendere come riferimento la guida di Php di HTML.it. Quindi daremo per scontato che siano state lette e assimilate le funzioni principali.
Nella pillola è presente anche una parte inerente PHP 5 versione beta, in questo caso il consiglio è di non utilizzare quei riferimenti ormai datati e preferire quanto andremo a descrivere in questo tutorial.
PHP 5 come modulo
Se non vi interessa avere una versione 4 stabile con la quale produrre scripts compatibili al 100% con le impostazioni del vostro fornitore di hosting, potete scegliere di installare la sola versione 5 come modulo di Apache, il che dovrebbe essere sufficiente a far sì che interpreti in modo presumibilmente fedele i "vecchi" scripts pensati per la versione 1 del motore Zend.
I passi per installare PHP 5 come modulo sono gli stessi di PHP 4, tranne per il fatto che non esiste più la directory SAPI (che conteneva le versioni "modulo" di PHP) e per le estensioni, che ora si trovano nella directory ext.
Quindi nell' editare il file httpd.conf di Apache dovremo inserire la riga "LoadModule php5_module C:/PHP/php5apache.dll" dove C:/PHP sarà ovviamente la directory dove avrete scompattato lo zip di PHP 5 (l'installer automatico invece va evitato) e dove la .dll sarà quella di riferimento per Apache o Apache 2 (in questo secondo caso C:/PHP/php5apache2.dll).
Per la sola versione 1.3.x di Apache dovrete modificare anche la voce "AddModule mod_php5.c" poche righe al di sotto della precedente.
Nella directory system32 di Windows copierete (o sposterete) il file php5ts.dll e se desiderate utilizzare anche MySQL, non più supportato di default nella versione 5 di PHP, dovrete copiare (o spostare) anche il file libmysql.dll (sempre in system32).
Il consiglio che posso dare ai più avventurosi è di copiare in system32 anche il file libmysqli.dll (mysql improved), così da poter utilizzare versioni superiori alla 3.23.49 per l' interazioni con MySQL, ormai stabile alla versione 4, affidabile alla 4.1 e ancora beta alla 5. Quest'ultima libreria vi permetterà di utilizzare alcune nuove features introdotte proprio in PHP 5 e MySQL 4.1 o superiori.
Non ci resta che specificare in php.ini le estensioni che intendiamo utilizzare (il consiglio è di rinominare la versione recommended e non la dist), dopo aver configurato i percorsi corretti per la document_root di Apache, aver fatto altrettanto per le extensions (extension_dir = "c:PHPext") ed aver copiato il file php.ini nella directory principale di windows.
Estensioni valide per PHP 5
Le estensioni che sono riuscito ad abilitare senza problemi sono le seguenti:
extension=php_bz2.dll
extension=php_cpdf.dll
;extension=php_curl. dll
;extension=php_dba.dll
;extension=php_dbase.dll
;extension=php_dbx.dll
;extension=php_exif.d ll
;extension=php_fdf.dll
extension=php_filepro.dll
extension=php_gd2.dll
;extension=php_gettext .dll
;extension=php_iconv.dll
;extension=php_ifx.dll
;extension=php_iisfunc.dll
extension=php_im ap.dll
;extension=php_interbase.dll
;extension=php_java.dll
;extension=php_ldap.dll
;extension=p hp_mbstring.dll
;extension=php_mcrypt.dll
;extension=php_mhash.dll
extension=php_mime_magic.dll
;extension=php_ming.dll
;extension=php_mssql.dll
;extension=php_msql.dll
;extension=php_mysqli.dll
extension=php_mysql.dll
;extension=php_oci8.dll
;extension=php_openssl.dll
;extension=p hp_oracle.dll
;extension=php_pdf.dll
;extension=php_pgsql.dll
extension=php_shmop.dll
extension= php_snmp.dll
extension=php_sockets.dll
;extension=php_sybase_ct.dll
extension=php_tidy.dll
;exte nsion=php_w32api.dll
extension=php_xmlrpc.dll
extension=php_xsl.dll
;extension=php_yaz.dll
;exte nsion=php_zip.dll
Starà a voi decommentare l'estensione mysqli qualora abbiate scelto di testare questo nuovo driver di interfaccia a MySQL.
Riavviate Apache (prima fermatelo con STOP poi avviatelo con START perché attualmente ci possono essere dei problemi in RESTART) e provate a creare una pagina info.php, nella document_root specificata, contenente la solita stringa <?php phpinfo(); ?> per valutare l' effettiva installazione della versione 5 di PHP come modulo.
Retrocompatibilità con PHP 4
Chi ha osservato nel dettaglio php.ini, avrà sicuramente notato che ad un certo punto è presente una voce inerente la retrocompatibilità con la versione 4 di php. La riga a cui mi riferisco è la seguente:
; Enable compatibility mode with Zend Engine 1 (PHP 4.x)
zend.ze1_compatibility_mode = Off
Nel caso doveste riscontrare problemi, provate a settarla su On.
Non è necessario attivare questa opzione perché attualmente la retrocompatibilità è "nativa", non ci sono problemi, perlomeno non ne ho mai avuti, nell' utilizzare scripts sviluppati nella versione 4 di PHP (anzi, alcuni problemi li ho avuti proprio quando ho attivato quell' opzione durante i primi tests da me effettuati sulla RC1).
Librerie condivise, la 4 o la 5?
Fino ad ora abbiamo visto come installare PHP 5 come modulo, lasciandoci alle spalle la versione 4 di PHP. Ma perché non far convivere entrambe le versioni installando un doppio modulo?
Il problema nasce dal fatto che PHP 5 ha dei files e delle estensioni che utilizzano le stesse librerie, per l'una e per l'altra versione. In parole povere, vanno in collisione e il webserver non riesce a dare la giusta interpretazione all' una o all' altra versione. Una delle cose che possiamo fare per far coesistere le due versioni è installarne una come modulo ed una come CGI (common gateway interface), permettendo al webserver di gestire in modo completamente autonomo l' una o l'altra versione.
PHP 5 come CGI
Se siete arrivati a questo punto significa che volete mantenere PHP 4 pur non rinunciando alla possibilità di sviluppare e testare le nuove features della 5. A questo punto ci sono diversi modi per far convivere le due versioni, sarete voi a decidere quale sia preferibile. Il più comodo e indolore è sicuramente quello che descriverò tra breve.
PHP 5 CGI in Apache
Scegliendo questo tipo di installazione, dovremo utilizzare un estensione differente (ad esempio .php5) al posto della solita .php, per far sì che Apache utilizzi il protocollo CGI con gli script che presentano questa estensione.
Questa soluzione presenta il vantaggio di consentirci una convivenza perfetta tra script PHP 4 e PHP 5 all'interno della stessa DocumentRoot.
Scompattate in una cartella dedicata la versione 5 di php, ad esempio in C:PHP5 e non fate altro se non editare il file php.ini (consiglio di rinominare il recommended ma va bene anche il dist).
Utilizzate a grandi linee gli stessi passaggi per il solo file php.ini descritti precedentemente sul come installare php5 come modulo. Fate attenzione a specificare i giusti percorsi ad esempio nelle extensions metterete: extension_dir = "C:PHP5ext"
Idem per gli includes, subito sopra: include_path = ".;c:PHP5includes"
La document_root sarà la stessa usata da PHP 4, le estensioni da decommentare saranno le stesse già descritte precedentemente e una volta salvato il file non dovrete fare altro.
Il file php.ini appena modificato va salvato nella stessa cartella, ovvero in C:PHP5, non copiate o spostate niente nella cartella del windows o nella system32.
Ora andiamo ad editare il file di configurazione di Apache ed aggiungiamo in fondo quanto segue:
ScriptAlias /php5-cgi/ "c:/PHP5/"
AddHandler php5-script .php5
Action php5-script /php5-cgi/php-cgi.exe
Queste impostazioni dicono ad Apache di utilizzare l'interprete PHP CGI per gli script che presentano l'estensione .php5, anzichè l'interprete integrato nel webserver (il più noto mod_php). Quello che posso consigliarvi è di verificare che il percorso messo tra virgolette nello ScriptAlias sia lo stesso della cartella di PHP 5 del vostro disco.
Se avete corretto le eventuali differenze potete stoppare Apache e farlo ripartire (consiglio sempre di usare STOP e poi START al posto del solo RESTART). Ora create un file di nome info.php5 scriveteci <?php phpinfo(); ?> e richiamate questo file dalla document_root del vostro Apache .... risultato? PHP in versione CGI/FastCGI spero funzionante e correttamente interpretato.
PHP 5 come CGI per Apache su porta dedicata
Una soluzione diversa dalla precendete: scegliamo di utilizzare PHP 5 con l'estensione tipica dei nostri scripts, ovvero la .php, ma evitando che Apache faccia confusione (.php sarà uno script versione 4 o 5? ... CGI o modulo?).
Il trucco consiste nel configurare un virtualhost su un' altra porta, così da separare in modo sicuro le due modalità di interpretazione (CGI e modulo integrato nel webserver), utilizzando comunque lo stesso ambiente (stesso webserver e stessa document_root).
Per ottenere questo risultato possiamo scrivere in fondo al file di configurazione di Apache, quanto segue:
Port 80
Listen 80
<VirtualHost *>
ServerName localhost
ServerAdmin me@localhost
DirectoryIndex index.php
DocumentRoot "C:/Programmi/Apache Group/Apache/htdocs"
ScriptAlias /cgi-bin/ "C:/PHP5/"
Action php5-script /cgi-bin/php-cgi.exe
AddHandler php5-script .php5
</VirtualHost>
Listen 81
<VirtualHost *:81>
ServerName localhost
ServerAdmin me@localhost
DirectoryIndex index.php
DocumentRoot "C:/Programmi/Apache Group/Apache/htdocs"
ScriptAlias /cgi-bin/ "C:/PHP5/"
Action php5-script /cgi-bin/php-cgi.exe
AddHandler php5-script .php .php5
</VirtualHost>
Anche in questo caso vi conviene controllare che i vari percorsi siano quelli corretti, per la document_root, per la cartella di PHP 5 e il nome del server.
Riavviando Apache tramite STOP, seguito da START, potrete notare che oltre al solito http://localhost/ vi ritroverete un http://localhost:81/ dove lo stesso identico file, ad esempio il solito info.php contenente il solito <?php phpinfo(); ?> verrà interpretato a seconda del localhost utilizzato, da PHP 4 come modulo o da PHP 5 come CGI.
Questo tipo di configurazione è secondo me la migliore per diversi aspetti:
- Test in "real-time" di compatibilità scripts per la 4 sulla 5 e viceversa (con l' estensione dedicata dovreste ogni volta copiare i file e cambiare estensione)
- Non ci sono problemi di include o require qualora decidiate di testare su più versioni il vostro stesso script (immaginate oltre all' estensione .php5 di dover riscrivere tutti i requires interni ai vostri scripts)
- I links interni ai files saranno gli stessi per l' una o per l'altra versione, ovvero $_SERVER["PHP_SELF"] punterà sempre al localhost con la giusta interpretazione, la 4 di default, la 5 per il localhost:81
- Manteniamo comunque la compatibilità con scripts che hanno estensione .php5 (sia nel localhost che nel solo localhost:81)
Se avete ancora dubbi o non siete sicuri che questo sia il miglior ambiente di produzione per la 4 e per la 5, potete provate a configurare PHP per essere eseguito attraverso CGI con IIS.
PHP 5 come CGI per IIS
Come molti sanno, la configurazione preferibile sotto OS Windows, è l'utilizzo dell'interprete PHP CGI in accoppiata con IIS (maggiori dettagli sulla questione potete trovarli in questo Php FAST CGI con Internet Information Services).
In Windows l'accoppiata IIS più PHP-CGI rappresenta una piattaforma più stabile rispetto a qualsiasi abbinamento con Apache.
C'è poco da aggiungere all' articolo appena citato perché l'installazione è pressochè identica, quindi ricordatevi di mettere come document root del php.ini la cartella ufficiale di IIS e niente più (solitamente la C:Inetpubwwwroot).
Cosa accade al vostro ambiente di sviluppo? Accade che a questo punto avete 2 webservers completamente differenti in esecuzione sullo stesso localhost, cosa non proprio corretta o ideale per un ambiente di produzione
A questo punto è possibile agire sulla configurazione di Apache, mettendolo in ascolto sulla porta 81 lasciando a questo virtualhost l' interpretazione di php4 come modulo e aggiungendo solamente.
Listen 81
<VirtualHost *:81>
ServerName localhost
DocumentRoot "C:/Programmi/Apache Group/Apache/htdocs"
</VirtualHost>
così da utilizzare localhost per la 5 e localhost:81 per la 4... a mio avviso, decisamente scomodo.
Possiamo invece scegliere di utilizzare l'uno o l'altro ambiente in modo separato, così da avere 1 solo localhost per avere la certezza di evitare ogni tipo di conflitto tra i 2 webservers. Come fare? Possiamo utilizzare uno switch.
Per switch intendo un file di tipo .bat comodamente trasportabile a portata di doppio clic dove vogliamo e che ci permetterà di fermare un webserver ed attivarne un altro e vice-versa.
APACHE.BAT
Questo file ci permetterà, tramite un doppio clic, di arrestare IIS e restartare Apache, così da utilizzare il solo PHP 4.
@cmd /C
IISRESET /STOP
cd C:ProgrammiApache GroupApache
Apache.exe -w -n "Apache" -k restart
Assicuratevi che il percorso per arrivare alla directory principale di Apache sia corretto, salvate il file e mettetelo nel desktop o in qualunque altra cartella del vostro PC.
IIS.BAT
È il file che vi permette di arrestare Apache e di far partire IIS e utilizzare solo PHP 5.
@cmd /C
cd C:ProgrammiApache GroupApache
Apache.exe -w -n "Apache" -k stop
IISRESET /RESTART
Assicuratevi anche in questo caso di aver scritto il corretto percorso per arrivare alla directory di Apache, salvate e mettete il file a portata di mouse dove preferite. Noterete come cliccando l'uno o l'altro file, una finestra di prompt vi avvisi di quanto stia accadendo facendo le varie procedure in modo automatico. Appena questa finestra scomparirà sarete liberi di testare i vostri 2 ambienti distinti a seconda delle esigenze di produzione del momento.
Conclusioni
L'accoppiata può essere installata e utilizzata, come abbiamo visto, in parecchie "salse", ognuna con i suoi vantaggi e svantaggi a seconda del tipo di approccio e di produzione che dobbiamo affrontare. Ma c'è una caratteristica che unisce tutte queste installazioni e che non ha a che fare direttamente con il PHP ma ha a che fare con la radice della nostra produzione, ovvero il Windows.
Non c'è infatti un metodo affidabile e allo stesso tempo veloce per utilizzare PHP, che sia 4, che sia 5, sotto Windows, se non tramite un applicativo dedicato della Zend di nome Zend WinEnabler, unico applicativo che permetterà a PHP di essere a grandi linee alla pari di una configurazione LAP (Linux, Apache, PHP) tramite l' interpretazione CGI ottimizzata per il sistema di casa Microsoft.