====== Note programmazione PHP ======
===== PHPSESSIONID =====
Quando si usano le sessioni il PHP riscrive gli URL relativi, aggiungendo la variabile ''**PHPSESSIONID**''. Questo è un meccanismo di sicurezza per tentare di far funzionare le sessioni nel caso che i cookie siano disabilitati. Se siamo sicuri che le sessioni funzionano tramite cookie e non vogliamo che gli URL vengano "sporcati", si possono impostare alcune opzioni nel file di configurazione di apache, in ''php.ini'' oppure nel codice PHP subito prima della funzione ''session_start()'':
# Those settings should double-assure that relative URLs
# will not be rewritten with ?PHPSESSID= added.
ini_set('url_rewriter.tags', '');
ini_set('session.use_trans_sid', false);
===== Scrivere gli URL =====
Dovendo generare un URL cliccabile:
$url = 'page?';
$url .= 'param=' . urlencode($value);
echo '';
Come si deve eventualmente codificare **page** e **param** dell'esempio precedente se contenessero caratteri strani?
===== Moduli PEAR non pacchettizzati =====
Volendo installare il pacchetto Pear MDB2 con il dirver PostgreSQL e il pacchetto Pear Auth: installato il pacchetto Ubuntu **php-pear**, i pacchetti aggiuntivi sono stati scaricati direttamente dal repository Pear, perché non presenti in Ubuntu (nota: in Debian invece esiste almeno il pacchetto **php-auth**):
pear install MDB2
pear install MDB2#pgsql
pear install -f OLE
pear install -f Spreadsheet_Excel_Writer
pear install Auth
L'opzione **-f** forza l'installazione anche in caso di versioni beta, ecc. I pacchetti Pear vengono salvati in ''**/usr/share/php/**''.
===== Personalizzare php.ini in esecuzione CGI o FastCGI =====
Se il PHP viene eseguito come [[wp>Common_Gateway_Interface|CGI]] oppure come [[wp>FastCGI]] le impostazioni tradizionali di php.ini oppure del VirtualHost di Apache non sono prese in considerazione.
Una soluzione è quella di creare un wrapper che faccia puntare ad una directory con il **''php.ini''** personalizzato ed eventualmente settare le necessarie variabili di ambiente.
Ecco un esempio per impostare la **Default timezone** e la **date.timezone**. Si crea un file **''php-fcgi-wrapper''**:
#!/bin/sh
PHPRC="/var/www/customer1/php-cgi/"
export PHPRC
PHP_DOCUMENT_ROOT="/var/www/customer1/www"
export PHP_DOCUMENT_ROOT
export TZ=Europe/Rome
exec /usr/bin/php-cgi $1
e quindi nel VirtualHost di Apache si attiva il wrapper con qualcosa del genere:
AddHandler fcgid-script .php .php3 .php4 .php5
FCGIWrapper /var/www/customer1/php-cgi/php-fcgi-wrapper .php
Options +ExecCGI
AllowOverride All
Order allow,deny
Allow from all
Nel php.ini personalizzato si può mettere ovviamente:
[Date]
date.timezone = Europe/Rome
Dopo aver modificato il wrapper - se si usa FastCGI - bisogna riavviare Apache in modo da ricaricarlo in memoria.
===== Gestione degli errori =====
Con alcuni software (CMS tipo Joomla, ecc.) è facile incappare in errori del tipo:
Strict Standards: Non-static method xxx should not be called statically in xxx/joomla/import.php on line 29
questo specialmente dopo l'aggiornamento a versioni superiori del PHP, che sono più rigide sulla sintassi del linguaggio.
Intanto può essere utile avere un pezzo di codice che genera un errore **''E_STRICT''**, in quanto tale errore non può essere generato dalla funzione **''trigger_error()''**, ecco un esempio:
class A { function toto( ) {} }
class B extends A { function toto($a) {} }
Quindi in php.ini si verifica che gli errori E_STRICT siano disabilitati:
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
Attenzione che Joomla tiene in cache le pagine generate, dopo aver modificato la configurazione del PHP è necessario svuotare la cache per vedere il risultato.