Per poter procedere con l'installazione del modulo di PHP per Apache prima di tutto bisogna procurarsi dal sito ufficiale www.php.net l'ultima versione stabile di PHP.
Il passo successivo consiste nell'estrarre e scompattare l'archivio tar.gz appena scaricato.
Successivamente bisogna compilare PHP secondo le proprie esigenze e in base ai supporti desiderati.
Un esempio di compilazione standard può essere il seguente:
./configure --with-mysql --with-apxs=/usr/local/apache/bin --with-config-file-path=/usr/local/apache/conf
In sostanza dopo essersi posizionati nella cartella contenente l'archivio PHP scompattato si richiama il comando ./configure a cui vengono aggiunte le opzioni apxs=... in pratica viene detto a PHP dove risiede il binario apxs (cioè nella cartella bin di apache), --with-mysql ovvero viene compilato PHP con il supporto per il database server mySQL e dove risiedono i files di configurazione di Apache. Ovviamente è facile intuire che se si desidera utilizzare altre opzioni basta compilare i sorgenti con l'aggiunta dell'opzione desiderata (es. --with-imap per il supporto imap di php).
In seguito bisogna procedere con il make e il make install per completare l'installazione.
A questo punto dobbiamo "dire" ad Apache quali file deve parsare con il compilatore PHP, in pratica basta aggiungere in httpd.conf il seguente codice:
# Dynamic Shared Object (DSO) Support
LoadModule php4_module libexec/libphp4.so
AddModule mod_php4.c
AddType application/x-httpd-php .php .php3
AddType application/x-httpd-php-source .phps
Ultimi due passi da compiere sono la copia di php.ini-dist come php.ini nella directory conf di Apache e il riavvio del servizio web.
L'alternativa per l'installazione del modulo di PHP su server web Apache è fornito dagli RPM, questa è una soluzione che comporta il vantaggio di una installazione più semplice a fronte di una minore possibilità di configurazione e customizzazione dell'installazione del modulo.
E' adatta a chi ha poca esperienza e soprattutto per chi ha fretta di preparare un server di test in breve tempo.
La prima cosa da fare è reperire sul web il pacchetto RPM desiderato, ad es. php-4.1.2-7.i386.rpm.
Successivamente non ci resta che installare PHP con il seguente comando:
rpm -iv php-4.1.2-7.i386.rpm
Riavviare apache dopo aver aggiunto le seguenti righe al file di configurazione di Apache httpd.conf (versione 1.3):
# Dynamic Shared Object (DSO) Support
LoadModule php4_module libexec/libphp4.so
AddModule mod_php4.c
AddType application/x-httpd-php .php .php3
AddType application/x-httpd-php-source .phps
Prima di procedere bisogna procurarsi l'ultima versione stabile di PHP per win32 sul sito ufficiale php.net.
Terminato il download l'installazione di PHP su una macchina con sistema operativo windows che utilizza apache come web server è decisamente molto semplice e il tutto viene fatto in pochi passaggi.
- Scompattare il file .zip appena scaricato in c:\php (es. ovviamente la directory scelta può essere anche c:\programmi\php etc...)
- Copiare il file presente in c:\programmi\php php.ini-dist in c:\windows o c:\winnt (a seconda del S.O.) e rinominarlo come php.ini .
- Andare nella directory di installazione di php e copiare il file php4ts.dll in c:\windows\system o c:\winnt\system32 .
- Inserire le seguenti righe di configurazione in httpd.conf (file di configurazione di Apache) dopo i vari AddModule:
LoadModule php4_module g:/programmi/php/sapi/php4apache.dll
AddType application/x-httpd-php .php
- Riavviare Apache ed il gioco è fatto. Per testare il funzionamento andate nella document root di apache e create il file phpinfo.php contenente il seguente codice:
E richiamatelo da browser, se l'output sarà la configurazione di PHP tutto è andato a buon fine.
Per l'analisi delle configurazioni principali di php.ini prendiamo in esame il php.ini-dist che presenta un tipo di configurazione meno esasperata e più user friendly nonchè oggettivamente più utile per la programmazione.
Cominciamo con il dire che php.ini gestisce tutte le configurazioni possibili (eccezion fatta per le modalità di installazione e compilazione).
I settaggi che metterò negli esempi sono quelli di default
La logica è davvero molto semplice, in pratica corrisponde a questo esempio:
settaggio = value
Permette l'utilizzo dei tag abbreviati
short_open_tags = On
Permette l'utilizzo di tag ASP
asp_tags = Off
Il numero di cifre significative nei numeri a virgola mobile
precision = 12
Forza la compatibilità con l'anno 2000 (crea problemi con non-compliant browser)
y2k_compliance = Off
Abilitazione del buffering dell'output. Settando "On" questa configurazione permetterete a PHP di inviare la pagina al browser solo al termine dell'esecuzione di tutti gli script e tutte le varie funzioni di echo o print venrranno immagazzinate nel buffer. Questo ha il vantaggio di permettere l'invio di header lines anche dopo l'invio del body. Inoltre nel caso che nella maggioranza delle pagine ci sia commistione di html tradizionale e html generato da php attraverso echo() o print().
Oppure qualora si senta l'esigenza di comprimere l'output per velocizzare lo scaricamento delle pagine (attivando nel php.ini sia il buffering che la compressione). Lo svantaggio principale è di rallentare l'esecuzione del codice PHP nel caso che lo script non sfruttati appieno queste opportunità.
Nel caso che il server fornisca hosting a diversi clienti è preferibile lasciare queste opzioni disabilitate e lasciare la libertà ai programmatori di sfruttare il buffering con le funzioni ob_start etc...
output_buffering = Off
Puoi redirezionare l'output degli scripts verso una funzione. Ad esempio impostando output_handler a ob_gzhandler, l'output verrà trasparentemente compresso per i browser che supportano gzip o browser che scompattano il codice.
output_handler =
Rende trasparente la compressione tramite le librerie gzip. Le impostazioni valide sono 'Off' 'On' o specificando il buffer size da utilizzare per la compressione (default = 4 Kbyte)
Importante: se si imposta questa configurazione ad 'On' output_handler DEVE essere settata 'On'
zlib.output_compressed = Off
Implicit flush è una opzion che deve essere settata Off, al massimo deve essere utilizzata solamente in fase di debugging in quanto ha gravi conseguenze sulle performance
implicit_flush = Off
Impostando "on" si forza a passare per reference gli argomenti quando viene chiamata la funzione. Questo metodo è deprecato (anche se di default è settato On) e viene consigliato di sistemare gli script per funzionare anche se questa configurazione è settata ad "on" in quanto in futuro verrà cancellata.
allow_call_time_pass_reference = On
Safe mode effettua un rigido controllo sugli utenti che "girano" nello spazio web in cui vengono eseguiti script php.
Normalmente tutti gli script ereditano i permessi di Apache (che con certe configurazioni del server possono rivelarsi troppo ampi), invece dal momento in cui viene attivato safe_mode, gli script agiranno strettamente con i permessi dell'utente che li ha uplodati (cioè, in uno spazio in hosting, l'utente ftp), quindi, ad esempio, non potranno andare a leggere un file creato con php nello spazio WEb di un altro utente (revisionato da Fabio Heller)
safe_mode = Off
Di default safe mode quando viene aperto un file fa un UID compare. Se vuoi "rilassare" il tuo script ad un GID compare bisogna impostare la seguente impostazione ad "On"
safe_mode_gid = Off
Quando il safe mode è impostato su "On" il controllo UID/GID è bypassato quando viene incluso un file da quella directory e dalle sue sottodirectory
safe_mode_include_dir =
Se si imposta "On" dice a PHP di dichiararsi presente sul server
expose_php = On
Limiti risorse:
Tempo massimo di esecuzione di uno script PHP
max_execution_time = 30
Massima quantità di memoria che uno script PHP può occupare per la sua esecuzione
memory_limit = 8M
Gestione degli errori (per maggiori dettagli in php.ini vengono spiegati i vari livelli di visualizzazione degli errori)
Questa configurazione mostra tutti gli errori eccetto le notifiche
error_reporting = E_ALL & E_NOTICE
Visualizzazione errori come parte dell'output della pagina. Questa opzione deve essere impostata "On" SOLO per siti in sviluppo, per server in produzione è vivamente consigliato di spegnere questa configurazione e di utilizzare il logging interno di PHP (più avanti spiegato) perchè potrebbe visualizzare informazioni critiche come il path dei file
display_errors = On
Anche quando display_errors = On, gli errori occorsi durante la sequenza di startup di PHP non vengono visualizzati. E' fortemente raccomandato per server in produzione di disattivare questa funzionalità
display_startup_errors = Off
Logging degli errori in un file di log. Il team di php.net avvisa di attivare questa opzione per server in produzione
log_errors = Off
Memorizza l'ultimo errore/warning in $php_errormsg (boolean)
track_errors = Off
Disabilita l'inclusione di tag HTML negli errori
html_errors = Off
Log errors in uno specifico file (valido se log_errors = On)
error_log = filename
IMPORTANTE! la configurazione di questo parametro è molto importante perchè definisce la compatibilità con vecchie versioni di PHP in qui era impostata di default ad "On" mentre ora per motivi di sicurezza è consigliato settare ad "Off" Regiter Globals.
In breve questa funzione permette di non dover richiedere una variabile passata in un URL come GET o come POST ma di averla già disponibile.
Se register_globals = On nel caso di un url del tipo: http://www.dominio.com/pippo.php?ID=56 se nella pagina successiva printo $ID il PHP visualizzerà 56, nel caso di register globals = Off la variabile sarà disponibile solamente in $_GET["ID"] o con le vecchie variabile in $HTTP_GET_VARS["ID"] e non come $ID
register_globals = On
Questa direttiva dice a PHP di dichiarare le variabili argv&argc (quelle contanenti le informazioni GET). Se non si usano queste variabili si può spegnere questa configurazione per ottenere maggiori performance.
register_argv = On
Massima dimensione di un POST di dati che PHP accetti
post_max_size = 8M
Questa direttiva è deprecata e php.net consiglia di utilizzare l'altra variabile di ordinamento dei GET POST COOKIE spiegata precedentemente
gpc_order = "GPC"
Importante: Magic quotes
Magic quotes per variabili in ingresso GET/POST/COOKIE: Vuol dire che a tutte le variabili in incoming come GPC vengono aggiunti gli slashes. Es. ' = \' " = \"
magic_quotes_gpc = On
Magic quotes per dati runtime (Es. dati da SQL, da exec etc...)
magic_quotes_runtime = Off
Utilizza magic quotes stile sybase (escape per ' con '' anzichè \')
magic_quotes_sybase = Off
Directory dove risiedono le estensioni
extension_dir = ./
Configurazione per enablare o meno le dl() function che non funzionano correttamente su multithread server, IIS e Zeus e vengono automaticamente disabilitate in questi server
enable_dl = On
File Uploads
Impostare il permesso di HTTP upload di files
file_uploads = On
Directory dei file temporanei in fase di upload (se commentate questa configurazione verrà utilizzata quella di default del S.O.)
upload_tmp_dir
Massima dimensione di un file accettata da PHP
upload_max_filesize = 2M
File Opening
Configurazione per concedere la possibilità del trattamento con fopen di URL file
allow_url_fopen = On
Dinamic extension
Windows extensions (se commentata non viene caricata) un esempio:
extension = php_cpdf.dll
Module settings
Configurazione per attivazione dei syslog (disabilitare questa opzione permette un incremento delle performance di PHP)
define_syslog_variables = Off
Funzioni email per windows
Impostazione SMTP server
SMTP = localhost
Invio email da:
sendmail_from = [email protected]
Funzioni email per unix
Path di sendmail
;sendmail_path = (commentata di default)
Configurazioni database
SQL
sql.safe_mode
ODBC
Permette o previene connessioni persistenti
odbc.allow_persistent = ON
Controlla che la connessione persistente sia valida prima di utilizzarla
odbc.check_persistent = On
Massimo numero di connessioni persistenti (-1 equivale ad infinite)
odbc.links = -1
MYSQL
Per eventuali configurazioni del tipo mysql.allow_persistent = On valgono le spiegazioni date per ODBC e così per i database supportati. (tratterò esclusivamente i casi specifici di ogni DB).
Porta di default di mySQL. Se lasciata blank viene utilizzata la porta di default 3306
mysql.default_port =
Nome socket per connessioni locali a mySQL. Se vuota viene utilizzata quella di default
mysql.default_socket = On
Default host per mysql_connect() (non applicabile in safe mode)
mysql.default_host
Default user per mysql_connect() (non applicabile in safe mode)
mysql.default_user =
Default password per mysql_connect() (non applicabile in safe mode). E' assolutamente sconsigliabile utilizzare una password di default!!
mysql.default_password =
POSTGRESQL
Individua connessioni persistenti broken con pg_connect(). Necessita di un piccolo overhead
pgsql.auto_reset_persistent = Off
SYBASE
Error severity minimo visualizzato
sybase.min_error_severity = 10
Si forza la compatibilità con versioni vecchie di PHP (3.0) in caso di settaggio ad On forza PHP a assegnare tipi di risultati del tipo di quelli di sybase.
Questa compatibilità non rimarrà a lungo
sybase.compatibility_mode = Off
SYBASE-CT
Massimo numero di connessioni (persistenti e non) accettate da sybase (-1 senza limiti)
sybct.max_links = -1
N.b.Non mi dilungherò ulteriormente sui database in quanto indicativamente per tutti i database le configurazioni sono simili, ci sono altri casi eccezionali comunque descritti ampiamente in PHP.INI
SESSIONI
Handler utilizzato per lo store ed il retrieve dei dati
session.save_handler = files
Path dove vengono immagazzinati i files delle sessioni
session.save_handler = /tmp
Se usare i cookies
session.use_cookies = 1
Nome della sessione (usato come cookie name)
session.name = PHPSESSID
Inizializzazione sessioni alla richiesta di startup
session.auto_start = 0
Tempo di vita del cookie (se 0 finchè il browser non viene restartato)
session.cookie_lifetime = 0
Path per il quale il cookie è valido
session.cookie_path = /
Handler utilizzato per la serializzazione dei dati (lo standard è PHP)
session.serialize_handler = php
Percentuale di possibilità che la "Garbage Collection" venga iniziata quando la sessione viene inizializzata
session.gc_probability = 1
Importante: Numero di secondi dopo il quale la sessione viene considerata scaduta (importante in caso di carrelli della spesa)
session.gc_maxlifetime = 1440
Controlla l'HTTP referer per la validazione di stored URL che contengono l'ids
session.referer_check =
Quanti bytes vengono letti dal file
session.entropy_lenght = 0
Specifica dove creare il session ID
session.entropy_file =
Setta il no cache
session.cache_limiter = nocache
Tempo di espirazione del documeto in N minuti
session.cache_expire = 180
E' molto rischioso abilitare il trans sid perchè permette di accedere ad una sessione tramite vecchi bookmarks o url stored e perchè l'utente può inviare l'URL contenente la sessione via mail, irc etc...
sessione.use_trans_sid = 0
E con questa ultima spiegazione ho terminato di trattare le configurazioni principali di php.ini
Esempio di configurazione per un sito in produzione (da prendere con le molle e da customizzare in base alle proprie esigenze) PHP.INI
Dalla versione 4.2.0 gli sviluppatori di PHP hanno deciso di rivoluzionare la gestione delle variabili provenienti dall'utente e hanno deciso di impostare nel file di configurazione php.ini
la variabile register_global = Off
di default non permettendo più il comodissimo ma insicuro sistema di assegnazione automatica ad una variabile del suo valore passato dall'esterno.
La comodità stava nel fatto che se passavo ad uno script “pippo.php?io=max” avevo direttamente disponibile la variabile $io che assumeva il valore “max”. Questo sistema era decisamente molto comodo e facilitava il compito del programmatore ma creava dei problemi di sicurezza per chè anche se nel php.ini era presente la configurazione variables_order che impostava la priorità con cui dovevano essere gestite le assegnazioni di una variabile da una GET, POST, COOKIE o SESSION c'era l'inconveniente che se un programmatore prevedeva un controllo su una variabile $control e un utente smaliziato passava allo script tramite GET control=qualcosa il controllo del programmatore veniva eluso e di conseguenza si apriva una falla gigantesca nell'applicazione.
Il problema è che tutte o quasi le applicazioni realizzate prima della versione 4.2.0 sono state sviluppate con l'impostazione delle variabili globali impostata ad On e per questa ragione chiunque offra hosting a webmaster esterni sarà costretto a mantenere questa configurazione per non compremettere la funzionalità delle applicazioni presenti sul proprio server web.
Comunque sia d'ora in avanti chi svilupperà software in PHP per mantenere una portabilità ed una longevità nonchè sicurezza intrinseca dovrà cercare di sviluppare considerando che register_global sia uguale ad Off perchè prima o poi gli sviluppatori di PHP forzeranno con una versione nuova gli hoster ad utilizzare la nuova configurazione.
Una volta installato il modulo per il linguaggio PHP su un Web Server è possibile testarne il funzionamento scrivendo una semplice pagina web.
La pagina da creare è composta da un file con estensione .php
, per esempio phpinfo.php, da inserire nella DocumentRoot del Web Server, la quale deve contenere al suo interno la chiamata a phpinfo()
. Questa funzione restituisce in output tutta una serie di valori riguardanti l'installazione del motore PHP sul proprio server. Informazioni che vanno dai parametri di compilazione, alle variabili d'ambiente ed il sistema operativo del server, fino alla licenza del linguaggio.
<HTML> <HEAD> <TITLE>Test PHP</TITLE> </HEAD>
<BODY>
<?php phpinfo(); ?>
</BODY> </HTML>
Per motivi di sicurezza è comunque opportuno, se questa pagina viene lasciata ai fini di test sul Web Server, assegnarle un nome non ovvio, e mantenerla in una posizione protetta in quanto potrebbe rivelare informazioni determinanti ai fini di un eventuale attacco.
Molti server di posta per combattere lo spam sono stati configurati per rifiutare email inviate da server che non siano dai mailer definiti.
Per ovviare al problema con PHP si devono utilizzare le funzioni PEAR, in quanto possono gestire direttamente il protocollo SMTP per la connessione e il relay della posta elettronica tramite un server di posta elettronica definito da configurazione nello script.
Un esempio molto semplice di script è il seguente:
----------------------------------------------
require_once 'Mail.php';
// Preparazione header dell'email
$recipients = '[email protected]';
$headers['From'] = '[email protected]';
$headers['To'] = '[email protected]';
$headers['Subject'] = 'Test invio email';
$body =
'
Body
';
// Configurazione dell'host mail che dovrà essere utilizzato dallo script per l'invio della mail
$params['host'] = 'mail.rete039.it';
// Setup del protocollo/servizio da utilizzare per l'inoltro della mail
$mail_object =& Mail::factory('smtp', $params);
// Invio dell'email
$mail_object->send($recipients, $headers, $body);
-------------------------------------------------
Utilizzando questo script e riadattandolo per le proprie esigenze si potrà ovviare al problema di cui sopra.
N.B. per il corretto funzionamento bisogna avere installato in PEAR anche il file Net/Socket.php