<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/features.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'it',
  ),
  'this' => 
  array (
    0 => 'features.persistent-connections.php',
    1 => 'Connessioni Persistenti ai Database',
    2 => 'Connessioni Persistenti ai Database',
  ),
  'up' => 
  array (
    0 => 'features.php',
    1 => 'Caratteristiche',
  ),
  'prev' => 
  array (
    0 => 'features.connection-handling.php',
    1 => 'Gestione della connessione',
  ),
  'next' => 
  array (
    0 => 'features.commandline.php',
    1 => 'Command line usage',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'it',
    'path' => 'features/persistent-connections.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="features.persistent-connections" class="chapter">
  <h1 class="title">Connessioni Persistenti ai Database</h1>


  <p class="simpara">
   Connessioni persistenti sono collegamenti che non vengono chiusi quando
   l&#039;esecusione di uno script viene terminata. Quando è richiesta una connessione
   persistente, PHP controlla se esiste già una identica connessione persistente
   (che è rimasta aperta da prima) - e se esiste, la
   usa. Se non esiste, crea il collegamento. Una connessione &#039;identica&#039;
   è una connessione aperta verso lo stesso host, con
   lo stesso username e la stessa password (dove applicabile).
  </p>
  <p class="simpara">
   Chi non ha molta familiarità con il modo in cui lavorano i server web
   e di come essi distribuiscano il carico potrebbero confondere le connessioni permanenti per ciò
   che esse non sono. In particolare, <em>non</em> danno
   la possibilità di aprire &#039;sessioni utente&#039; sullo stesso collegamento, 
   <em>non</em> danno la possibilità di gestire una transazione in
   maniera efficiente e sopratutto non fanno molte altre
   cose. Infatti, per essere molto chiari su questo punto,
   le connessioni persistenti non hanno <em>nessuna</em>
   funzionalià che non era disponibile con le loro omonime
   non-persistenti.
  </p>
  <p class="simpara">
   Perché?
  </p> 
  <p class="simpara">
   Questo ha a che fare con il modo in cui i server web operano. Ci sono tre modi
   in cui un server web può utilizzare PHP per generare le pagine web.
  </p>
  <p class="simpara">
   Il primo metodo è quello di usare il PHP come un &quot;wrapper&quot; (involucro) CGI. Quando viene
   eseguito in questa modalità, per ogni pagina che viene richiesta al server web
   che contenga del codice PHP, viene creata e, alla fine dell&#039;esecuzione, distrutta,
   una istanza dell&#039;interprete PHP.  Poiché viene distrutta alla fine di ogni richiesta, qualunque risorsa
   abbia acquisito (come ad esempio un collegamento ad un server di database SQL) verrà
   anch&#039;essa distrutta. In questo caso, non vi è nessun guadagno nell&#039;usare
   le connessioni persistenti -- semplicemente esse non persistono.
  </p>
  <p class="simpara">
   Il secondo, e più popolare, metodo è quello di eseguire il programma PHP come modulo in un
   server web multiprocesso, cosa che attualmente include solo Apache. Un
   server multiprocesso ha tipicamente un processo (il padre) che
   coordina un insieme di processi (i suoi figli) che sono quelli che
   generano le pagine web. Quando arriva una richiesta da parte di un
   client, questa è passata ad uno dei figli che in quel momento
   non è già occupato a servire un altro client. Questo significa che quando lo stesso client effettua
   una seconda richiesta al server, esso potrà essere servito da un diverso processo
   figlio rispetto a quello della prima volta. Quando si aprono delle connessioni persistenti,
   ciascuna pagina successiva che richiede dei servizi SQL, può riutilizzare la
   connessione al server SQL precedente.
  </p>
  <p class="simpara">
   L&#039;ultimo metodo è quello di usare il PHP come una plug-in per un server web
   multithread. Attualmente PHP 4 supporta ISAPI, WSAPI e NSAPI (su piattaforma
   Windows), i quali permettono di usare PHP come una plug-in sui server web multithread
   come FastTrack (iPlanet) di Netscape, Internet Information Server (IIS) di Microsoft e
   WebSite Pro di O&#039;Reilly. Il comportamento è essenzialmente
   lo stesso che si ha nel modello multiprocesso descritto prima.
  </p>
  <p class="simpara">
   Se le connessioni persistenti non hanno nessuna funzionalità aggiuntiva, perch´
   usarle?
  </p>
  <p class="simpara">
   La risposta, in questo caso è estremamente semplice: efficienza. Le connessioni
   persistenti sono utili se il carico di lavoro necessario per aprire una connessione al server SQL
   è alto. Che il carico sia molto alto o meno dipende
   da molti fattori. Quali, il tipo di database che si utilizza, il fatto che
   esso si trovi sulla stessa macchina sulla quale si trova il server web, quanto
   carico di lavoro ha la macchina sulla quale si trova il server SQL, e molte altre ragioni. Il
   fatto importante è che se il carico di lavoro necessario per aprire le connessioni è alto, le
   connessioni persistenti possono aiutare in maniera considerevole. Fanno in modo che il processo figlio si
   colleghi semplicemente una volta durante la sua intera vita, invece di collegarsi ogni volta che
   processa una pagina che richiede una connessione al server SQL.
   Questo significa che per ogni figlio che ha aperto una connessione 
   persistente, si avrà una nuova connessione persistente aperta verso il
   server. Per esempio, se si hanno 20 diversi processi figlio che
   eseguono uno script che crea una connessione persistente al server SQL server,
   si avranno 20 diverse connessioni al server SQL, una per ogni
   figlio.
  </p>
  <p class="simpara">
   Si fa notare, tuttavia, che questo può avere degli svantaggi se si fa uso di
   un database che ha un limite al numero di connessioni, minore rispetto al numero delle
   connessioni persistenti dei procesi figlio. Se per esempio di usa un database con 16 connessioni simultanee,
   e durante un periodo di intensa attività del web server, 17 processi figlio
   cercano di collegarsi, uno non sarà in grado di farlo. Se nei vostri script
   ci sono bug che non permettono alle connessioni di chiudersi in maniera regolare
   (come ad esempio un loop infinito), un database con sole 16 connessioni
   diventerà rapidamente saturo. Fare riferimento alla documentazione del database per
   informazioni su come gestire connessioni abbandonate o inattive.
  </p>
  <div class="warning"><strong class="warning">Avviso</strong>
   <p class="simpara">
    Ci sono un paio di altri caveat da tenere in considerazione quando
    si usano le connessioni persistenti. Uno è che quando si usa il table
    locking su una connessione persistente, se lo script, per una qualunque
    ragione non è in grado di rimuovere il blocco, allora i successivi script che useranno
    la stessa connessione rimarranno bloccati in maniera indefinita e potrebbe essre necessario
    riavviare il server httpd o il server database. Un altro è che
    quando si usano le transazioni, un transaction block verrà trasferito
    anche allo script successivo che usa la medesima connessione, se lo script in esecuzione
    termina prima che sia terminato il transaction block. In entrambi i casi, si può
    usare <span class="function"><a href="function.register-shutdown-function.php" class="function">register_shutdown_function()</a></span> per registrare una
    semplice funzione di pulizia per sbloccare le tabelle o effettuare il roll back delle
    transaczioni. Sarebbe meglio non dover affrontare il problema, semplicemente non usando
    le connessioni persistenti negli script che usano i lock delle tabelle o
    le transaczioni (si possono comunque usare in altre situazioni).
   </p>
  </div>
  <p class="simpara">
   Sommario importante. Le connessioni persistenti sono state pensate per avere
   una mappatura uno-a-uno con le connessioni di tipo normale. Ciò significa che si
   dovrebbe <em>sempre</em> essere in grado di cambiare una connessione persistente
   con una connessione non-persistente, e che questo non dovrebbe cambiare
   il modo in cui lo script si comporta. <em>Può</em> (e
   probabilmente succederà) cambiare l&#039;efficienza dello script, ma non il suo 
   comportamento!
  </p>
  <p class="para">
   Vedere anche <span class="function"><strong>fbsql_pconnect()</strong></span>,
   <span class="function"><a href="function.ibase-pconnect.php" class="function">ibase_pconnect()</a></span>, <span class="function"><strong>ifx_pconnect()</strong></span>,
   <span class="function"><strong>ingres_pconnect()</strong></span>,
   <span class="function"><strong>msql_pconnect()</strong></span>, <span class="function"><strong>mssql_pconnect()</strong></span>,
   <span class="function"><a href="function.mysql-pconnect.php" class="function">mysql_pconnect()</a></span>, <span class="function"><a href="function.ociplogon.php" class="function">ociplogon()</a></span>,
   <span class="function"><a href="function.odbc-pconnect.php" class="function">odbc_pconnect()</a></span>, <span class="function"><a href="function.oci-pconnect.php" class="function">oci_pconnect()</a></span>,
   <span class="function"><a href="function.pfsockopen.php" class="function">pfsockopen()</a></span>, <span class="function"><a href="function.pg-pconnect.php" class="function">pg_pconnect()</a></span>, e
   <span class="function"><strong>sybase_pconnect()</strong></span>.
  </p>
 </div>
<?php manual_footer($setup); ?>