Monday, 19 July 2010

Usare le Connessioni permanenti


Nel connettersi ad un database, oltre alla classica modalità di temporary connection, spesso si ha necessità di utilizzare le connessioni permanenti, che l'Application server riunisce in un pool di persistent connections.

Le connessioni permanenti hanno la particolarità di non chiudersi quando termina l'esecuzione dello script. PHP verifica se c'è un'identica connessione (stesso host, username e password) che non sia stata chiusa: se c'è la utilizza, altrimenti la crea.

L'utilità delle connessioni permanenti risalta maggiormente quando ci sono molti utenti che utilizzano brevi connessioni. In questo caso, infatti, il server utilizza il pool invece di aprire e chiudere una connessione per ogni query/dataset (considerando che ogni apertura comporta un costo operativo).

Un server Web multiprocesso (tipicamente, Apache) ha un processo padre che coordina un set di processi figli: quando viene richiesta una pagina dal client, il server alloca la risorsa scegliendo il primo processo figlio libero. Il problema delle connessioni temporanee, è che uno stesso client che effettua una nuova richiesta al server può essere servito da un nuovo processo, andando a creare due (o più) connessioni per una stessa pagina. Invece, se la connessione è permanente ogni pagina che effettua richieste SQL può riutilizzare la stessa connessione.
La controindicazione è nel numero massimo di connessioni che il database supporta. Bisogna verificare la documentazione per parametrizzare correttamente le connessioni (comprese abandoned e idle connections)

Ecco un esempio di codice di connessione in MySQL:

$connect=mysql_pconnect($dbhost, $dbuser, $dbpass);
if (!$connect)
    die("Errore durante la connessione a MySQL ".mysql_error());
mysql_select_db($dbname ,$connect);
mysql_query('set names utf8');

Naturalmente questo frammento di codice va posto in un file separato chiamato a livello globale, e non inserito in ogni pagina (altrimenti verrebbe aperta una connessione permanente per ogni richiesta!). Questo consente anche di avere codice scalabile e modificabile sostituendo connessioni permanenti e non permanenti.

Post a Comment