mirror of
https://github.com/php/doc-ja.git
synced 2026-03-24 07:02:08 +01:00
468 lines
18 KiB
XML
468 lines
18 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<!-- $Revision$ -->
|
|
<!-- EN-Revision: 7cff4d34f0324c9de72d15957e1b62e20f37dfaf Maintainer: takagi Status: ready -->
|
|
<!-- Credits: mumumu --><set xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="set.mysqlinfo">
|
|
<title>MySQL ドライバおよびプラグイン</title>
|
|
<titleabbrev>MySQL</titleabbrev>
|
|
|
|
<info xml:id="mysqlinfo.info">
|
|
<abstract>
|
|
<simpara>
|
|
PHP で MySQL を扱うためのドライバやプラグインには、いくつかの種類があります。
|
|
</simpara>
|
|
<simpara>
|
|
それらの違いや MySQL 用拡張モジュールの機能について、ここで簡単に説明します。
|
|
</simpara>
|
|
<simpara>
|
|
ここで説明している拡張モジュールは、MySQL プロトコルをサポートしています。
|
|
それと互換性のあるデータベースサーバーは、
|
|
<link xlink:href="&url.mariadb;">MariaDB Server</link>,
|
|
<link xlink:href="&url.mysql;">MySQL Server</link>,
|
|
<link xlink:href="&url.perconaserver;">Percona Server for MySQL</link>,
|
|
<link xlink:href="&url.tidb;">TiDB</link> です。
|
|
</simpara>
|
|
</abstract>
|
|
</info>
|
|
|
|
<book xml:id="mysql">
|
|
<title>MySQL 用 PHP ドライバの概要</title>
|
|
|
|
<preface xml:id="mysqlinfo.intro">
|
|
<title>はじめに</title>
|
|
|
|
<simpara>
|
|
PHP から MySQL データベースにアクセスするための API は複数あります。
|
|
<link linkend="book.mysqli">mysqli</link> あるいは
|
|
<link linkend="ref.pdo-mysql">PDO_MySQL</link> が利用できます。
|
|
</simpara>
|
|
<simpara>
|
|
このページでは、これらの API についての説明に登場する
|
|
<link linkend="mysqlinfo.terminology">用語</link>
|
|
について解説したり、
|
|
<link linkend="mysqlinfo.api.choosing">いったいどの API を使えばいいのか</link>
|
|
を説明したり、選んだ API と組み合わせる MySQL の
|
|
<link linkend="mysqlinfo.library.choosing">ライブラリ</link>
|
|
について説明したりします。
|
|
</simpara>
|
|
</preface>
|
|
|
|
<chapter xmlns="http://docbook.org/ns/docbook" xml:id="mysqlinfo.terminology">
|
|
<title>用語説明</title>
|
|
<simpara>
|
|
このセクションでは、PHP アプリケーションの開発で MySQL データベースを扱う
|
|
ときの選択肢について説明します。
|
|
</simpara>
|
|
|
|
<simpara>
|
|
<emphasis role="bold">API って何?</emphasis>
|
|
</simpara>
|
|
|
|
<simpara>
|
|
API は Application Programming Interface の略で、
|
|
何らかのタスクを実行するためにアプリケーションから呼び出す必要のある
|
|
クラスやメソッド、関数、変数などを定義したものです。
|
|
データベースとの通信を必要とする PHP アプリケーションが使うための
|
|
API は、通常は PHP の拡張モジュールとして公開されています。
|
|
</simpara>
|
|
|
|
<simpara>
|
|
API は手続き型にすることもできるし、オブジェクト指向型にすることもできます。
|
|
手続き型の API の場合は何かの処理を実行するための関数を呼ぶことになり、
|
|
オブジェクト指向型の API の場合はクラスのインスタンスを作ってそのメソッドを呼ぶことになります。
|
|
通常は、後者の方法をおすすめします。後者のほうがよりモダンであり、
|
|
きっちりとしたコードを書けるからです。
|
|
</simpara>
|
|
|
|
<simpara>
|
|
MySQL サーバーとの接続が必要な PHP アプリケーションを書く場合に
|
|
使える API はいくつかあって、その中から選べます。
|
|
このドキュメントでは、どんな API が使えてどれを選ぶのが最適なのかを解説します。
|
|
</simpara>
|
|
|
|
<simpara>
|
|
<emphasis role="bold">コネクタとは</emphasis>
|
|
</simpara>
|
|
|
|
<simpara>
|
|
MySQL のドキュメントで使われている <emphasis>コネクタ</emphasis> という用語は、
|
|
何かのアプリケーションから MySQL データベースサーバーに接続するためのソフトウェアのことを指します。
|
|
MySQL はさまざまな言語用のコネクタを提供しており、PHP もその中に含まれます。
|
|
</simpara>
|
|
|
|
<simpara>
|
|
PHP のアプリケーションでデータベースサーバーとの通信が必要になったときには、
|
|
データベースサーバーへの接続やデータベースへの問い合わせなどの関数を呼ぶ
|
|
PHP コードを書くことになるでしょう。つまり、PHP アプリケーションから使える
|
|
API を提供するソフトウェアが必要になるということです。
|
|
そのソフトウェアは、アプリケーションとデータベースサーバーの間の通信も処理しないといけません。
|
|
おそらくは中間ライブラリも利用することになるでしょう。
|
|
このソフトウェアのことを一般的にコネクタと呼びます。というのも、このソフトウェアのおかげで
|
|
アプリケーションがデータベースサーバーに
|
|
<emphasis>接続 (connect)</emphasis> できるようになるからです。
|
|
</simpara>
|
|
|
|
<simpara>
|
|
<emphasis role="bold">ドライバとは</emphasis>
|
|
</simpara>
|
|
|
|
<simpara>
|
|
ドライバとは、特定のデータベースサーバーとの通信をするために作られたソフトウェアのことです。
|
|
ドライバはライブラリと呼ばれることもあり、
|
|
MySQL Client Library や MySQL Native Driver というように使われます。
|
|
これらのライブラリが実装するのは低レベルのプロトコルで、
|
|
これを使って MySQL データベースサーバーと通信します。
|
|
</simpara>
|
|
|
|
<simpara>
|
|
例を挙げると、データベース抽象化レイヤーの <link linkend="mysqli.overview.pdo">PHP
|
|
Data Objects (PDO)</link> は各データベース専用のドライバの中からひとつを選んで使います。
|
|
数あるドライバの中のひとつに PDO MYSQL ドライバがあり、これが
|
|
MySQL サーバーとのインターフェイスとなります。
|
|
</simpara>
|
|
|
|
<simpara>
|
|
人によっては、コネクタとドライバを混同して使うこともあって、混乱の元となります。
|
|
MySQL 関連のドキュメントでは、
|
|
<quote>コネクタ</quote> という用語はデータベース固有の機能を提供するソフトウェアという意味で
|
|
予約されています。
|
|
</simpara>
|
|
|
|
<simpara>
|
|
<emphasis role="bold">拡張モジュールとは</emphasis>
|
|
</simpara>
|
|
|
|
<simpara>
|
|
PHP のドキュメントを読んでいると、
|
|
<emphasis>拡張モジュール</emphasis> という用語がよく出てきます。
|
|
PHP のコードには、コア機能とは別に
|
|
オプションの拡張モジュールが用意されています。
|
|
PHP で使える MySQL 関連の拡張モジュールには <literal>mysqli</literal> があり、
|
|
PHP の拡張モジュール用フレームワークを使って実装されています。
|
|
</simpara>
|
|
|
|
<simpara>
|
|
拡張モジュールは一般的に PHP プログラマー向けの API を公開しており、
|
|
その機能をプログラムから使えるようになっています。
|
|
しかし、PHP 拡張モジュールフレームワークを使って書かれた拡張モジュールの中には、
|
|
PHP プログラマー向けの API を公開していないものもあります。
|
|
</simpara>
|
|
|
|
<simpara>
|
|
たとえば PDO MySQL ドライバは PHP の拡張モジュールですが、
|
|
それ自体は PHP プログラマー向けの API を公開していません。
|
|
さらに上位にある PDO レイヤーへのインターフェイスを提供しているだけです。
|
|
</simpara>
|
|
|
|
<simpara>
|
|
API と拡張モジュールとは同じ意味ではありません。
|
|
拡張モジュールが必ずしもプログラマー向けの API を公開しているとは限らないからです。
|
|
</simpara>
|
|
</chapter>
|
|
|
|
<chapter xmlns="http://docbook.org/ns/docbook" xml:id="mysqlinfo.api.choosing">
|
|
<title>どの API を使うか</title>
|
|
<simpara>
|
|
PHP には、様々な MySQL へ接続する API があります。
|
|
以下に、mysqli と PDO が提供する API を示します。
|
|
それぞれのコードは、"example.com" 上で稼働する MySQL サーバーに
|
|
ユーザー名 "user"、パスワード "password" で接続するものです。
|
|
そして、クエリを実行してユーザーにあいさつします。
|
|
</simpara>
|
|
<example>
|
|
<title>MySQL 用 API の比較</title>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
// mysqli
|
|
$mysqli = new mysqli("example.com", "user", "password", "database");
|
|
$result = $mysqli->query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL");
|
|
$row = $result->fetch_assoc();
|
|
echo htmlentities($row['_message']);
|
|
|
|
// PDO
|
|
$pdo = new PDO('mysql:host=example.com;dbname=database', 'user', 'password');
|
|
$statement = $pdo->query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL");
|
|
$row = $statement->fetch(PDO::FETCH_ASSOC);
|
|
echo htmlentities($row['_message']);
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
<example>
|
|
<title>プリペアドステートメントの比較</title>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
// mysqli
|
|
$mysqli = new mysqli("example.com", "user", "password", "database");
|
|
$statement = $mysqli->prepare("SELECT District FROM City WHERE Name=?");
|
|
$statement->execute(["Amersfoort"]);
|
|
$result = $statement->get_result();
|
|
$row = $result->fetch_assoc();
|
|
echo htmlentities($row['District']);
|
|
|
|
// PDO
|
|
$pdo = new PDO('mysql:host=example.com;dbname=database', 'user', 'password');
|
|
$statement = $pdo->prepare("SELECT District FROM City WHERE Name=?");
|
|
$statement->execute(["Amersfoort"]);
|
|
$row = $statement->fetch(PDO::FETCH_ASSOC);
|
|
echo htmlentities($row['District']);
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
<simpara>
|
|
<emphasis role="bold">機能の比較</emphasis>
|
|
</simpara>
|
|
<simpara>
|
|
全体的なパフォーマンスは、どれもほぼ同じです。
|
|
拡張モジュール自体のパフォーマンスが PHP のウェブリクエストの実行時間に及ぼす影響はごくわずかで、
|
|
たいていは 0.1% 程度に過ぎません。
|
|
</simpara>
|
|
<informaltable xml:id="mysqlinfo.api.choosing.changelog">
|
|
<tgroup cols="3">
|
|
<thead>
|
|
<row>
|
|
<entry/>
|
|
<entry>ext/mysqli</entry>
|
|
<entry>PDO_MySQL</entry>
|
|
</row>
|
|
</thead>
|
|
<tbody>
|
|
<row>
|
|
<entry>どのバージョンの PHP から使えるか</entry>
|
|
<entry>5.0</entry>
|
|
<entry>5.1</entry>
|
|
</row>
|
|
<row>
|
|
<entry>PHP 7.x と PHP 8.x に同梱されているか</entry>
|
|
<entry>Yes</entry>
|
|
<entry>Yes</entry>
|
|
</row>
|
|
<row>
|
|
<entry>開発状況</entry>
|
|
<entry>進行中</entry>
|
|
<entry>進行中</entry>
|
|
</row>
|
|
<row>
|
|
<entry>ライフサイクル</entry>
|
|
<entry>活動中</entry>
|
|
<entry>活動中</entry>
|
|
</row>
|
|
<row>
|
|
<entry>新規開発でおすすめできるか</entry>
|
|
<entry>Yes</entry>
|
|
<entry>Yes</entry>
|
|
</row>
|
|
<row>
|
|
<entry>オブジェクト指向のインターフェイス</entry>
|
|
<entry>Yes</entry>
|
|
<entry>Yes</entry>
|
|
</row>
|
|
<row>
|
|
<entry>手続き型のインターフェイス</entry>
|
|
<entry>Yes</entry>
|
|
<entry>No</entry>
|
|
</row>
|
|
<row>
|
|
<entry>mysqlnd によるノンブロッキングな非同期クエリ</entry>
|
|
<entry>Yes</entry>
|
|
<entry>No</entry>
|
|
</row>
|
|
<row>
|
|
<entry>持続的接続</entry>
|
|
<entry>Yes</entry>
|
|
<entry>Yes</entry>
|
|
</row>
|
|
<row>
|
|
<entry>文字セット</entry>
|
|
<entry>Yes</entry>
|
|
<entry>Yes</entry>
|
|
</row>
|
|
<row>
|
|
<entry>サーバーサイドのプリペアドステートメント</entry>
|
|
<entry>Yes</entry>
|
|
<entry>Yes</entry>
|
|
</row>
|
|
<row>
|
|
<entry>クライアントサイドのプリペアドステートメント</entry>
|
|
<entry>No</entry>
|
|
<entry>Yes</entry>
|
|
</row>
|
|
<row>
|
|
<entry>ストアドプロシージャ</entry>
|
|
<entry>Yes</entry>
|
|
<entry>Yes</entry>
|
|
</row>
|
|
<row>
|
|
<entry>複数ステートメント</entry>
|
|
<entry>Yes</entry>
|
|
<entry>Most</entry>
|
|
</row>
|
|
<row>
|
|
<entry>トランザクション</entry>
|
|
<entry>Yes</entry>
|
|
<entry>Yes</entry>
|
|
</row>
|
|
<row>
|
|
<entry>SQL によるトランザクション制御</entry>
|
|
<entry>Yes</entry>
|
|
<entry>Yes</entry>
|
|
</row>
|
|
<row>
|
|
<entry>MySQL 5.1+ の全機能への対応</entry>
|
|
<entry>Yes</entry>
|
|
<entry>Most</entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup>
|
|
</informaltable>
|
|
</chapter>
|
|
|
|
<chapter xmlns="http://docbook.org/ns/docbook" xml:id="mysqlinfo.library.choosing">
|
|
<title>どのライブラリを選ぶか</title>
|
|
<simpara>
|
|
mysqli、PDO_MySQL といった PHP 拡張モジュールは、
|
|
どれも C クライアントライブラリの軽量なラッパーです。これらの拡張モジュールは、
|
|
<link linkend="book.mysqlnd">mysqlnd</link> ライブラリあるいは <literal>libmysqlclient</literal>
|
|
ライブラリのいずれかを使えます。どちらを使うのかを決めるのは、コンパイル時です。
|
|
</simpara>
|
|
<simpara>
|
|
mysqlnd ライブラリは、PHP の一部として配布されています。
|
|
遅延接続やクエリのキャッシュなど、libmysqlclient にはない機能も搭載されているので、
|
|
この mysqlnd ライブラリを使うことを強くおすすめします。
|
|
<link linkend="book.mysqlnd">mysqlnd のドキュメント</link>
|
|
には、さらなる詳細情報や機能一覧があります。
|
|
</simpara>
|
|
<example>
|
|
<title>mysqlnd あるいは libmysqlclient を使う場合の configure コマンド</title>
|
|
<programlisting role="shell">
|
|
<![CDATA[
|
|
// おすすめの方法。mysqlnd を使ってコンパイルします。
|
|
$ ./configure --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd
|
|
|
|
// もうひとつのおすすめの方法。mysqlnd を使ってコンパイルします。
|
|
$ ./configure --with-mysqli --with-pdo-mysql
|
|
|
|
// おすすめしない方法。libmysqlclient を使ってコンパイルします。
|
|
$ ./configure --with-mysqli=/path/to/mysql_config --with-pdo-mysql=/path/to/mysql_config
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
<simpara>
|
|
<emphasis role="bold">ライブラリの機能比較</emphasis>
|
|
</simpara>
|
|
<simpara>
|
|
<link linkend="book.mysqlnd">mysqlnd</link> を使うほうが、
|
|
MySQL Client Server library (libmysqlclient) よりもおすすめです。
|
|
どちらのライブラリも、開発が続いています。
|
|
</simpara>
|
|
<informaltable xml:id="mysqlinfo.library.choosing.changelog">
|
|
<tgroup cols="3">
|
|
<thead>
|
|
<row>
|
|
<entry/>
|
|
<entry>MySQL Native Driver (<link linkend="book.mysqlnd">mysqlnd</link>)</entry>
|
|
<entry>MySQL クライアントサーバーライブラリ (<literal>libmysqlclient</literal>)</entry>
|
|
</row>
|
|
</thead>
|
|
<tbody>
|
|
<row>
|
|
<entry>PHP の配布物に同梱</entry>
|
|
<entry>Yes</entry>
|
|
<entry>No</entry>
|
|
</row>
|
|
<row>
|
|
<entry>どのバージョンの PHP から使えるか</entry>
|
|
<entry>5.3.0</entry>
|
|
<entry>N/A</entry>
|
|
</row>
|
|
<row>
|
|
<entry>ライセンス</entry>
|
|
<entry>PHP License 3.01</entry>
|
|
<entry>デュアルライセンス</entry>
|
|
</row>
|
|
<row>
|
|
<entry>開発状況</entry>
|
|
<entry>進行中</entry>
|
|
<entry>進行中</entry>
|
|
</row>
|
|
<row>
|
|
<entry>ライフサイクル</entry>
|
|
<entry>終了予定なし</entry>
|
|
<entry>終了予定なし</entry>
|
|
</row>
|
|
<row>
|
|
<entry>コンパイルのデフォルト (すべての MySQL 拡張モジュール)</entry>
|
|
<entry>Yes</entry>
|
|
<entry>No</entry>
|
|
</row>
|
|
<row>
|
|
<entry>圧縮プロトコルへの対応</entry>
|
|
<entry>Yes</entry>
|
|
<entry>Yes</entry>
|
|
</row>
|
|
<row>
|
|
<entry>SSL への対応</entry>
|
|
<entry>Yes</entry>
|
|
<entry>Yes</entry>
|
|
</row>
|
|
<row>
|
|
<entry>名前付きパイプへの対応</entry>
|
|
<entry>Yes</entry>
|
|
<entry>Yes</entry>
|
|
</row>
|
|
<row>
|
|
<entry>ノンブロッキングの非同期クエリ</entry>
|
|
<entry>Yes</entry>
|
|
<entry>No</entry>
|
|
</row>
|
|
<row>
|
|
<entry>パフォーマンス統計</entry>
|
|
<entry>Yes</entry>
|
|
<entry>No</entry>
|
|
</row>
|
|
<row>
|
|
<entry>LOAD LOCAL INFILE での <link linkend="ini.open-basedir">open_basedir</link> の反映</entry>
|
|
<entry>Yes</entry>
|
|
<entry>No</entry>
|
|
</row>
|
|
<row>
|
|
<entry>PHP ネイティブのメモリ管理システムを使う (PHP のメモリ制限などに従う)</entry>
|
|
<entry>Yes</entry>
|
|
<entry>No</entry>
|
|
</row>
|
|
<row>
|
|
<entry>数値型のカラムを double 型で返す (COM_QUERY)</entry>
|
|
<entry>Yes</entry>
|
|
<entry>No</entry>
|
|
</row>
|
|
<row>
|
|
<entry>数値型のカラムを string 型で返す (COM_QUERY)</entry>
|
|
<entry>Yes</entry>
|
|
<entry>Yes</entry>
|
|
</row>
|
|
<row>
|
|
<entry>プラグイン API</entry>
|
|
<entry>Yes</entry>
|
|
<entry>Limited</entry>
|
|
</row>
|
|
<row>
|
|
<entry>自動再接続</entry>
|
|
<entry>No</entry>
|
|
<entry>オプション</entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup>
|
|
</informaltable>
|
|
</chapter>
|
|
|
|
&reference.mysqlinfo.concepts;
|
|
|
|
</book>
|
|
|
|
&reference.mysqli.book;
|
|
&reference.mysql-xdevapi.book;
|
|
&reference.mysql.book;
|
|
&reference.mysqlnd.book;
|
|
|
|
</set>
|