<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/mysqli.quickstart.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ja',
  ),
  'this' => 
  array (
    0 => 'mysqli.quickstart.connections.php',
    1 => 'データベース接続',
    2 => 'データベース接続',
  ),
  'up' => 
  array (
    0 => 'mysqli.quickstart.php',
    1 => 'クイックスタートガイド',
  ),
  'prev' => 
  array (
    0 => 'mysqli.quickstart.dual-interface.php',
    1 => '手続き型とオブジェクト指向インターフェイス',
  ),
  'next' => 
  array (
    0 => 'mysqli.quickstart.statements.php',
    1 => 'ステートメントの実行',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ja',
    'path' => 'reference/mysqli/quickstart.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="mysqli.quickstart.connections" class="section">
  <h2 class="title">データベース接続</h2>
  <p class="para">
   MySQL は、サーバーに接続するために、
   異なるトランスポート層をサポートしています。
   TCP/IP, Unix ドメインソケット、
   そして、Windows の名前付きパイプです。
  </p>
  <p class="para">
   ホスト名 <code class="literal">localhost</code> には特別な意味があります。
   これは、Unixドメインソケットにバインドされます。
   localhost に対して TCP/IP 接続を開くには、
   <code class="literal">localhost</code> の代わりに、
   <code class="literal">127.0.0.1</code> を使わなければいけません。
  </p>
  <p class="para">
   <div class="example" id="example-1">
    <p><strong>例1 localhost が持つ特別な意味</strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$mysqli </span><span style="color: #007700">= new </span><span style="color: #0000BB">mysqli</span><span style="color: #007700">(</span><span style="color: #DD0000">"localhost"</span><span style="color: #007700">, </span><span style="color: #DD0000">"user"</span><span style="color: #007700">, </span><span style="color: #DD0000">"password"</span><span style="color: #007700">, </span><span style="color: #DD0000">"database"</span><span style="color: #007700">);<br /><br />echo </span><span style="color: #0000BB">$mysqli</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">host_info </span><span style="color: #007700">. </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$mysqli </span><span style="color: #007700">= new </span><span style="color: #0000BB">mysqli</span><span style="color: #007700">(</span><span style="color: #DD0000">"127.0.0.1"</span><span style="color: #007700">, </span><span style="color: #DD0000">"user"</span><span style="color: #007700">, </span><span style="color: #DD0000">"password"</span><span style="color: #007700">, </span><span style="color: #DD0000">"database"</span><span style="color: #007700">, </span><span style="color: #0000BB">3306</span><span style="color: #007700">);<br /><br />echo </span><span style="color: #0000BB">$mysqli</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">host_info </span><span style="color: #007700">. </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;</span></span></code></div>
    </div>

    <div class="example-contents"><p>上の例の出力は以下となります。</p></div>
    <div class="example-contents screen">
<div class="cdata"><pre>
Localhost via UNIX socket
127.0.0.1 via TCP/IP
</pre></div>
    </div>
   </div>
  </p>
  <p class="para">
   <strong>デフォルトの接続パラメータ</strong>
  </p>
  <p class="para">
   接続関数によっては、
   引数を省略できる場合があります。
   引数が与えられない場合、
   拡張モジュールは PHP の設定ファイルに設定されたデフォルト値を使おうとします。
  </p>
  <p class="para">
   <div class="example" id="example-2">
    <p><strong>例2 デフォルト値を設定する</strong></p>
    <div class="example-contents">
<div class="inicode"><pre class="inicode">mysqli.default_host=192.168.2.27
mysqli.default_user=root
mysqli.default_pw=&quot;&quot;
mysqli.default_port=3306
mysqli.default_socket=/tmp/mysql.sock</pre>
</div>
    </div>

   </div>
  </p>
  <p class="para">
   結果として決まった引数の値が、
   拡張モジュールが使うクライアントライブラリに渡されます。
   クライアントライブラリが空、または未設定の引数を検知した場合、
   ライブラリに組み込まれたデフォルト値が使われます。
  </p>
  <p class="para">
   <strong>ライブラリに組み込まれたデフォルト値</strong>
  </p>
  <p class="para">
   host の値が未設定または空の場合、
   クライアントライブラリはデフォルト値を
   Unixドメインソケットの <code class="literal">localhost</code> とします。
   socket の値が未設定または空の場合、
   かつ Unixドメインソケットの接続がリクエストされた場合、
   デフォルトのソケット <code class="literal">/tmp/mysql.sock</code>
   を使って接続を試みます。
  </p>
  <p class="para">
   Windows の場合、
   ホスト名 <code class="literal">.</code>
   は、クライアントライブラリによって
   Windows の名前付きパイプベースの接続をオープンするものと解釈されます。
   この場合、socket のパラメータはパイプの名前として解釈されます。
   この値が未設定または空の場合、
   ソケット(パイプ名)のデフォルトは
   <code class="literal">\\.\pipe\MySQL</code> となります。
  </p>
  <p class="para">
   Unixドメインソケットベース、
   および Windows の名前付きパイプベースの接続が両方確立されず、
   port パラメータが未設定の場合、
   ライブラリはデフォルトのポートを
   <code class="literal">3306</code> に設定します。
  </p>
  <p class="para">
   <a href="mysqlnd.overview.php" class="link">mysqlnd</a>
   ライブラリと
   MySQL Client Library (libmysqlclient) は、
   デフォルト値を決めるためのロジックは同じです。
  </p>
  <p class="para">
   <strong>接続オプション</strong>
  </p>
  <p class="para">
   接続オプションも利用可能です。
   たとえば、接続時に実行される初期化コマンドや、
   特定の文字セットを使うようにリクエストするなど、です。
   接続オプションはネットワーク接続が確立される前に設定しなくてはいけません。
  </p>
  <p class="para">
   接続オプションを設定するために、
   接続操作は3つの段階を踏んで行われます。
   <span class="function"><a href="mysqli.init.php" class="function">mysqli_init()</a></span>
   または <span class="methodname"><a href="mysqli.construct.php" class="methodname">mysqli::__construct()</a></span>
   を使って接続ハンドルを初期化し、
   <span class="methodname"><a href="mysqli.options.php" class="methodname">mysqli::options()</a></span> を使って
   リクエストされた接続オプションを設定し、
   <span class="methodname"><a href="mysqli.real-connect.php" class="methodname">mysqli::real_connect()</a></span>
   で、ネットワーク接続を確立します。
  </p>
  <p class="para">
   <strong>接続のプーリング</strong>
  </p>
  <p class="para">
   mysqli 拡張モジュールは、
   データベースへの持続的接続をサポートしています。
   これは、特別な種類の接続で、プーリングされます。
   デフォルトでは、
   スクリプトによってオープンされたデータベース接続それぞれが、
   ユーザによって明示的に閉じられるか、
   スクリプトによって自動的に開放されます。
   持続的接続はそうではなく、
   開放する代わりに、後に再利用するためにプールに戻します。
   同じサーバーへの接続が同じユーザ名、
   パスワード、ソケット、ポート、
   そしてデフォルトデータベースを指定してオープンされた場合、
   接続が再利用され、接続のオーバーヘッドが軽減されます。
  </p>
  <p class="para">
   PHP のプロセスごとに、mysqli の接続プールが使われます。
   webサーバーがどのように運用されるかによりますが、
   PHP のプロセスはひとつ以上のリクエストを処理する可能性があります。
   よって、プーリングされた接続は
   ひとつ以上のスクリプトから後に使われる可能性があるのです。
  </p>
  <p class="para">
   <strong>持続的接続</strong>
  </p>
  <p class="para">
   あるホスト名、ユーザ名、パスワード、ソケット、ポート、
   そしてデフォルトのデータベースの組み合わせについて、
   未使用の持続的接続がプールに見つからない場合、
   mysqli は新しい接続をオープンします。
   持続的接続を使うかどうかは、
   <a href="mysqli.configuration.php#ini.mysqli.allow-persistent" class="link">mysqli.allow_persistent</a>
   を使って制御できます。
   スクリプトがオープンする接続の合計数は、
   <a href="mysqli.configuration.php#ini.mysqli.max-links" class="link">mysqli.max_links</a>
   で制御できます。
   PHP プロセス毎に使う持続的接続の最大数は
   <a href="mysqli.configuration.php#ini.mysqli.max-persistent" class="link">mysqli.max_persistent</a>
   で制御できます。
   Webサーバーは多くの
   PHP プロセスをforkさせる可能性があることに注意して下さい。
  </p>
  <p class="para">
   持続的接続についてよくある不満が、
   再利用する前にステートがリセットされないというものです。
   たとえば、
   オープンされ、終了していないトランザクションは
   自動的にロールバックされません。
   しかし同時に
   接続をプールに戻し、
   再利用するまでの間に行われた認証情報の変更も反映されません。
   これは、望ましくない副作用と見なされるかもしれません。
   一方で、<code class="literal">persistent</code> という名前は、
   ステートを維持することを約束していると理解されるかもしれません。
  </p>
  <p class="para">
   mysqli 拡張モジュールは、
   持続的接続について、両方の解釈をサポートしています:
   ステートを維持するか、
   再利用する前にステートをリセットするか、です。
   デフォルトはリセットです。
   持続的接続が再利用される前に、
   mysqli 拡張モジュールは暗黙のうちに
   ステートをリセットするために
   <span class="methodname"><a href="mysqli.change-user.php" class="methodname">mysqli::change_user()</a></span> をコールします。
   持続的接続は、
   これによってちょうど今オープンされたかのようにユーザの前に出現します。
   以前利用されていた状態は見えません。
  </p>
  <p class="para">
   <span class="methodname"><a href="mysqli.change-user.php" class="methodname">mysqli::change_user()</a></span>
   をコールすると、コストが高く付きます。
   パフォーマンスを最大にするために、
   ユーザーはコンパイルフラグ
   <strong><code>MYSQLI_NO_CHANGE_USER_ON_PCONNECT</code></strong> 
   を設定して、拡張モジュールをリコンパイルしたいかもしれません。
  </p>
  <p class="para">
   安全な振る舞いと、
   最大のパフォーマンスのどちらを取るかは、
   ユーザに任されています。
   どちらを選んでも、最適化の目的としては正当なものです。
   使いやすさを求めれば、
   パフォーマンスを犠牲にして安全な振る舞いを行わせる
   ことがデフォルトになります。
  </p>
  <p class="para">
   <strong>参照</strong>
  </p>
  <p class="para">
   <ul class="simplelist">
    <li><span class="methodname"><a href="mysqli.construct.php" class="methodname">mysqli::__construct()</a></span></li>
    <li><span class="function"><a href="mysqli.init.php" class="function">mysqli_init()</a></span></li>
    <li><span class="methodname"><a href="mysqli.options.php" class="methodname">mysqli::options()</a></span></li>
    <li><span class="methodname"><a href="mysqli.real-connect.php" class="methodname">mysqli::real_connect()</a></span></li>
    <li><span class="methodname"><a href="mysqli.change-user.php" class="methodname">mysqli::change_user()</a></span></li>
    <li><a href="mysqli.get-host-info.php" class="link">$mysqli::host_info</a></li>
    <li><a href="mysqli.configuration.php" class="link">MySQLi Configuration Options</a></li>
    <li><a href="features.persistent-connections.php" class="link">Persistent Database Connections</a></li>
   </ul>
  </p>
 </div><?php manual_footer($setup); ?>