<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/book.mysqli.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'de',
  ),
  'this' => 
  array (
    0 => 'mysqli.persistconns.php',
    1 => 'Die Erweiterung mysqli und persistente (best&auml;ndige) Verbindungen',
    2 => 'Die Erweiterung mysqli und persistente (best&auml;ndige) Verbindungen',
  ),
  'up' => 
  array (
    0 => 'book.mysqli.php',
    1 => 'Mysqli',
  ),
  'prev' => 
  array (
    0 => 'mysqli.configuration.php',
    1 => 'Laufzeit-Konfiguration',
  ),
  'next' => 
  array (
    0 => 'mysqli.constants.php',
    1 => 'Vordefinierte Konstanten',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'de',
    'path' => 'reference/mysqli/persistconns.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="mysqli.persistconns" class="chapter">

 <h1 class="title">Die Erweiterung mysqli und persistente (beständige) Verbindungen</h1>


 <p class="para">
  Die Idee hinter persistenten Verbindungen ist, dass eine Verbindung zwischen
  einem Client-Prozess und einer Datenbank von einem Client-Prozess mehrfach
  verwendet werden kann, anstatt jedes Mal neu erstellt und zerstört zu
  werden. Da ungenutzte Verbindungen zwischengespeichert werden und zur
  Wiederverwendung bereitstehen, reduziert sich der Mehraufwand, der entsteht,
  wenn jedes Mal eine neue Verbindung erstellt werden muss.
 </p>

 <p class="para">
  Im Gegensatz zur Erweiterung mysql bietet mysqli keine eigene Funktion zum
  Öffnen von persistenten Verbindungen. Um eine persistente Verbindung zu
  öffnen, muss dem Hostnamen beim Aufbau der Verbindung das Präfix
  <code class="literal">p:</code> vorangestellt werden.
 </p>

 <p class="para">
  Das Problem bei persistenten Verbindungen ist, dass sie von Clients in
  unvorhersehbaren Zuständen hinterlassen werden können. Zum Beispiel könnte
  eine Tabellensperre aktiviert werden, bevor ein Client unerwartet beendet
  wird. Ein neuer Client-Prozess, der diese persistente Verbindung
  wiederverwendet, erhält die Verbindung <q class="quote">as is</q> (so wie sie
  ist). Der neue Client-Prozess müsste alle notwendigen Aufräumarbeiten
  durchführen, bevor er die persistente Verbindung sinnvoll nutzen kann, was
  den Aufwand für den Programmierer erhöht.
 </p>

 <p class="para">
  Für diese Aufräumarbeiten ist in der persistenten Verbindung der
  Erweiterung <code class="literal">mysqli</code> jedoch ein entsprechender Code
  enthalten. Die Aufräumarbeiten, die von <code class="literal">mysqli</code>
  durchgeführt werden, umfassen:
 </p>

 <ul class="itemizedlist">

  <li class="listitem">
   <p class="para">
    das Rollback aktiver Transaktionen
   </p>
  </li>

  <li class="listitem">
   <p class="para">
    das Schließen und Löschen temporärer Tabellen
   </p>
  </li>

  <li class="listitem">
   <p class="para">
    das Entsperren von Tabellen
   </p>
  </li>

  <li class="listitem">
   <p class="para">
    das Zurücksetzen von Sessionvariablen
   </p>
  </li>

  <li class="listitem">
   <p class="para">
    das Schließen vorbereiteter Anweisungen (geschieht bei PHP immer)
   </p>
  </li>

  <li class="listitem">
   <p class="para">
    das Schließen von Handlern
   </p>
  </li>

  <li class="listitem">
   <p class="para">
    die Freigabe von Sperren, die mit <span class="function"><strong>GET_LOCK()</strong></span> gesetzt wurden
   </p>
  </li>

 </ul>

 <p class="para">
  Dadurch wird sichergestellt, dass sich eine persistente Verbindungen in
  einem bereinigten Zustand befindet, wenn sie aus dem Verbindungs-Pool
  abgerufen wird, bevor der Client-Prozess sie verwendet.
 </p>

 <p class="para">
  Die Erweiterung <code class="literal">mysqli</code> erledigt diese Bereinigung durch
  den automatischen Aufruf der C-API-Funktion
  <code class="literal">mysql_change_user()</code>.
 </p>

 <p class="para">
  Die automatisierte Bereinigung hat jedoch Vor- und Nachteile. Der Vorteil
  ist, dass der Programmierer sich nicht mehr darum kümmern muss, den
  Bereinigungscode hinzuzufügen, da er automatisch aufgerufen wird. Der
  Nachteil ist jedoch, dass der Code <em>eventuell</em> etwas
  langsamer sein könnte, da er zur Durchführung der Bereinigung jedes Mal
  ausgeführt werden muss, wenn eine Verbindung aus dem Verbindungs-Pool
  abgerufen wird.
 </p>

 <p class="para">
  Der Code für die automatische Bereinigung kann abgeschaltet werden, indem
  PHP mit der Option <strong><code>MYSQLI_NO_CHANGE_USER_ON_PCONNECT</code></strong>
  kompiliert wird.
 </p>

 <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
  <p class="para">
   Die Erweiterung <code class="literal">mysqli</code> unterstützt persistente
   Verbindungen, wenn sie entweder den MySQL Native Driver oder die MySQL
   Client Library verwendet.
  </p>
 </p></blockquote>

</div>
<?php manual_footer($setup); ?>