PHP come modulo VS PHP come CGI.PHP è un gran bel progetto opensource, bisogna ammetterlo. Il suo codice sorgente è disponibile e per questo motivo lo si può ricompilare per meglio adattarlo alle proprie esigenze. Alla luce di ciò è possibile, in alcuni server / VPS, ricompilare PHP e renderlo eseguibile come CGI, in ambienti Apache. Ma esattamente
cosa vuol dire avere PHP come CGI e qual'è il vantaggio?
Per spiegare questo facciamo un passo indietro. PHP è un interprete che prende del codice formattato secondo lo standard di programmazione PHP e, attraverso un parsing interno mediante il quale vengono richiamate molte librerie, lo traduce in codice plaintext/html. C'è molta confusione su questo fatto e spesso sento dire che php
crea del codice macchina a partire da un file .php! Il parsing può essere fatto sia a livello di
modulo di apache che a livello di
CGI e la sostanziale differenza risiede nel fatto che il modulo è direttamente collegato ad apache, condividendo alcune caratteristiche critiche come la memoria, mentre il CGI è un "programma" a sé stante. Se PHP è modulato con apache e va in crash, potrebbe andare in crash anche apache, con il risultato che per colpa di un sito l'intero network può andare offline. Inoltre PHP come modulo di apache può presentare alcuni inconvenienti di sicurezza che, in determinate configurazioni del server, potrebbero portare al blocco dello stesso o all'acquisizione di privilegi non reali.
E usando PHP come CGI? I problemi sopra descritti vengono eliminati o quantomeno attenuati. In primis apache può chiedere di processare un file a PHP-cgi e se questo va in crash apache genera un errore ma non va in crash a sua volta. Inoltre non si permette ad un utente, che può essere benissimo un "malintenzionato" per dirla alla Microsoft, di accedere al server con le credenziali di apache-user. Per ultima cosa PHP-cgi è molto più flessibile in quanto può essere ricompilato con librerie aggiuntive o, di pari merito, senza alcune librerie che potrebbero pesare sul sistema senza essere utilizzate. Prendiamo ad esempio le librerie
exif (che leggono i metadati dalle immagini JPEG ove presenti) o
mssql (che si interfacciano ad un database Microsoft SQL), sono abilitate su tantissimi server ma scarsamente utilizzate. Prendiamo, invece, le librerie
imap (mediante le quali si può accedere ad un mailserver col protocollo imap/imap-tls) o openSSL (attreverso le quali si possono utilizzare connessioni sicure cifrate) che quasi mai sono disponibili sebbene, in alcuni ambiti, molto importanti.
Usando PHP come modulo se tali estensioni non sono presenti non possono essere utilizzate mentre se c'è la possibilità di usare
PHP come CGI possono essere incluse.
Non è da sottovalutare nemmeno il fatto che avendo PHP-cgi è possibile avere una propria versione del PHP.INI e intervenire su un gran numero di variabili che potrebbero rendere più veloce (o più lento!) e più sicuro (o meno sicuro!) tutto l'ambiente...
Un altro vantaggio è dovuto dal fatto che spesso i provider si dimenticano di aggiornare PHP a versioni più performanti ed evolute, oltre che sicure. PHP 5 è ormai sufficientemente maturo da poter essere usato ed è molto più "veloce" rispetto al suo fratello maggiore PHP 4.
Una breve guida per usare PHP come CGI.Prima di iniziare vediamo quali sono i requisti per poter avere un PHP personalizzato, se non si è ovviamente il responsabile del server!
- Avere Apache come webserver
- Avere la possibilità di CHMOD e in particolare la possibilità di rendere eseguibilei i files
- Poter usare un file .htaccess
E' consigliato, ma non necessario, avere un accesso shell. In questa parte della guida terrò conto che ogni operazione viene fatta da shell. In particolare se si vuole ricompilare PHP la shell è quasi d'obbligo mentre se si vuole usare un eseguibile già pronto basta un comune programma FTP.
Per poter utilizzare PHP come CGI è necessario ricompilarlo partendo dai sorgenti e dai moduli che si intende includere. Ricompilare PHP però è un lavoro molto particolare che richiede conoscenze, anche perchè è spesso fattibile su sistemi GNU/Linux o via ssl/shell. Nella stragrande maggioranza dei casi, però, l'interprete compilato può essere trasferito da un sistema ad un altro e, grazie anche alla licenza GNU, può venir usato senza problemi. Per questo motivo trovare in rete un PHP già compilato non è un problema (se vi dovesse servire posso fornirvi il "mio").
Supponiamo che il file si chiami
php5.cgi, prestando attenzione al fatto che in ambiente GNU/Linux l'estensione non è indicativa del tipo di file. Avendo questo file si è quasi giunti alla fine! Basta, infatti, metterlo su una qualsiasi cartella, che in questa guida chiameremo
cgi-bin, e renderlo eseguibile. Vediamo come:
cd /home/lacellula/www/www.miosito.it/cgi-bin/
chmod +x php5.cgi
Ovviamente il path
/home/lacellula/www/ è di fantasia
Per poter istruire Apache a trattare i files
.php con PHP-cgi basta usare un file .htaccess da mettere nella directory
/home/lacellula/www/www.miosito.it/Options +ExecCGI
AddHandler php-cgi .php
Action php-cgi /cgi-bin/php5.cgi
Tutto fatto! A questo punto basta un phpinfo() per vedere se tutto ha funzionato. Riepiloghiamo un pò la struttura
/
.htaccess
phpinfo.php
/cgi-bin/
php5.cgi
php.ini (facoltativo, vedere avanti)
PHP.ini personalizzatoPrima accennavo al fatto che mediante PHP-cgi è possibile avere un php.ini personalizzato. E' vero, basta infatti copiare (o creare) un file che si chiama
php.ini e metterlo nella directory
cgi-bin. Non è essenziale perchè se tale file non risulta presente PHP-cgi provvede ad usare quello di default del server.
Conclusioni.E' vero, non serve a molti avere una versione di PHP propria e sono tanti i provider che impediscono una direzione in tal senso ma perchè, quantomeno, non provare? Spesso si è costretti a cambiare host, perdendo magari cifre anticipate, perchè "il cliente vuole un software che con questa versione di PHP non
gira" quando basterebbe una piccola configurazione per evitare ciò.
Altrettanto spesso si rinuncia a funzioni molto utili, come ad esempio la compressione/decompressione zip o gz, perchè il provider ha server con PHP 4.x o comunque è una estensione disabilitata.