Vai al contenuto

mysql_connect() o mysql_pconnect(): quale usare?

Quando tentate di connettervi ad un database MySQL utilizzando PHP, solitamente avete a disposizione due funzioni per effettuare il collegamento. Esse sono:

  1. mysql_connect()
  2. mysql_pconnect()

Vediamo la differenza tra le due funzioni, qui di seguito.

funzione mysql_connect()

Questa funzione crea una nuova connessione al database una volta che lo script inizia l’esecuzione e chiude la connessione al database una volta esecuzione dello script termina. Questo significa che PHP effettuerà una connessione al database MySQL ogni volta che il nostro script viene eseguito.

funzione mysql_pconnect()

Quando si effettua un tentativo di connessione al database utilizzando mysql_pconnect(), questa funzione cercherà un collegamento esistente al database utilizzando al solito username e password. Se viene trovata una connessione esistente, la funzione restituisce l’ID della risorsa, altrimenti aprirà una nuova connessione e restituirà l’ID della nuova risorsa.

Dopo un’ora di connessione verrà restituito solo l’ID della risorsa (se esistente) e non cercherà, a differenza di mysql_connect() di aprire una nuova connessione ogni volta che lo script viene richiamato. Ovviamente la connessione non verrà chiusa una volta terminato lo script. Per questo motivo la connessione è persistente.

Tuttavia mysql_pconnect() richiede una certa ottimizzazione del server e potrebbe essere necessario limitare il numero di connessioni (per via delle risorse limitate) e configurare sia il timeout sia come trattare l’inattività (idle) delle connessioni aperte.

Quando usare una o l’altra funzione?

Si dovrebbe usare mysql_pconnect() quando il sito genera un alto traffico e quindi maggiori richieste di connessioni al DB. Se PHP e MySQL risiedono sullo stesso server o sulla stessa rete locale, il tempo di connessione può essere trascurabile, nel qual caso non vi è alcun vantaggio nell’uso delle connessioni persistenti.

Cose da tenere a mente durante l’utilizzo mysql_pconnect

Quando si interroga una tabella, MySQL effettua un lock su una tabella e normalmente la tabella viene sbloccata quando il collegamento si chiude. Dal momento che le connessioni persistenti non si chiudono al termine dello script, le tabelle potrebbero rimanere in uno stato di lock, e l’unico modo per sbloccarle è quello di attendere il timeout della connessione o “killare” il processo.

Le tabelle temporanee in MySQL vengono solitamente eliminate quando la connessione si chiude, ma dal momento che le connessioni persistenti non si chiudono, le tabelle temporanee non sono così temporanei. Se non si cancellano esplicitamente le tabelle temporanee, tali tabelle rimarranno disponibili ad altri client che riutilizzano la stessa connessione.

Il server Apache non funziona bene con le connessioni persistenti. Quando riceve una richiesta da un nuovo cliente, invece di utilizzare una connessione persistente aperta, tende a generare un nuovo figlio, il quale si occuperà di aprire una nuova connessione al database. Questo causa un eccesso di processi dormienti, uno spreco inutile di risorse, causando degli errori quando si raggiungere limite massimo di connessioni aperte, e ciò annulla qualsiasi vantaggio sulle connessioni persistenti.

A voi la scelta!