<?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 => 'ja',
  ),
  'this' => 
  array (
    0 => 'mysqli.persistconns.php',
    1 => 'mysqli 拡張モジュールでの持続的接続',
    2 => 'mysqli 拡張モジュールでの持続的接続',
  ),
  'up' => 
  array (
    0 => 'book.mysqli.php',
    1 => 'MySQLi',
  ),
  'prev' => 
  array (
    0 => 'mysqli.configuration.php',
    1 => '実行時設定',
  ),
  'next' => 
  array (
    0 => 'mysqli.constants.php',
    1 => '定義済み定数',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ja',
    '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">mysqli 拡張モジュールでの持続的接続</h1>


 <p class="para">
  持続的接続とは、クライアントプロセスとデータベースとの間の接続を
  何度も作っては破棄するかわりにクライアントプロセス側で再利用しようというものです。
  これにより、必要なときに毎回新規接続を作成するというオーバーヘッドが軽減でき、
  未使用の接続はキャッシュされて再利用できるようになります。
 </p>
 
 <p class="para">
  他の mysql 用拡張モジュールとは異なり、mysqli には持続的接続のオープン専用の関数はありません。
  持続的な接続をオープンするには、接続時にホスト名の前に
  <code class="literal">p:</code> をつけなければなりません。
 </p>

 <p class="para">
  持続的接続の問題は、予期せぬ状態でクライアント側に残ってしまう可能性があるということです。
  たとえば、テーブルロックを行った状態でクライアントが突然終了してしまったとしましょう。
  新しいクライアントプロセスがこの持続的接続を使用する際には、
  <q class="quote">そのまま</q> の状態でこれを使うことになります。
  新しいクライアントプロセスがこの持続的接続をきちんと使うためには事前になんらかの後始末が必要となります。
  これはプログラマにとっては面倒な作業です。
 </p>

 <p class="para">
  しかし、<code class="literal">mysqli</code>
  拡張モジュールの持続的接続には後始末を行うコードが組み込まれています。
  <code class="literal">mysqli</code> は、以下のような後始末を行います。
 </p>

 <ul class="itemizedlist">

  <li class="listitem">
   <p class="para">
    アクティブなトランザクションのロールバック
   </p>
  </li>

  <li class="listitem">
   <p class="para">
    一時テーブルを閉じて drop
   </p>
  </li>

  <li class="listitem">
   <p class="para">
    テーブルロックの解除
   </p>
  </li>

  <li class="listitem">
   <p class="para">
    セッション変数の初期化
   </p>
  </li>

  <li class="listitem">
   <p class="para">
    プリペアドステートメントを閉じる (PHP では常に発生)
   </p>
  </li>

  <li class="listitem">
   <p class="para">
    ハンドラを閉じる
   </p>
  </li>

  <li class="listitem">
   <p class="para">
    <span class="function"><strong>GET_LOCK()</strong></span> で取得したロックの開放
   </p>
  </li>

 </ul>

 <p class="para">
  これにより、コネクションプールから取得する接続がクリーンな状態であることが確実になり、
  そのままクライアントプロセスで使用できるようになります。
 </p>

 <p class="para">
  <code class="literal">mysqli</code> 拡張モジュールのクリーンアップ処理は、
  C の API 関数 <code class="literal">mysql_change_user()</code>
  を自動的にコールすることで行っています。
 </p>

 <p class="para">
  しかし、自動クリーンアップ処理にはいい面もあれば悪い面もあります。
  利点としては、プログラマがクリーンアップのコードを書くことを気にせずにすむということがあります。
  自動的にコールされるからです。しかし、多少動作が遅くなるという
  <em>可能性</em> もあります。
  接続がコネクションプールに戻される際に毎回クリーンアップが必要となるからです。
 </p>

 <p class="para">
  自動クリーンアップのコードを無効にしたい場合は、

  <strong><code>MYSQLI_NO_CHANGE_USER_ON_PCONNECT</code></strong>

  を define して PHP をコンパイルします。
 </p>

 <blockquote class="note"><p><strong class="note">注意</strong>: 
  <p class="para">
   <code class="literal">mysqli</code> 拡張モジュールは、
   MySQL Native Drive あるいは MySQL Client Library
   のどちらを使っている場合でも持続的接続をサポートします。
  </p>
 </p></blockquote>

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