-
Notifications
You must be signed in to change notification settings - Fork 79
/
Copy pathset.xml
475 lines (443 loc) · 17.8 KB
/
set.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 67ddbaff3cebd1defc9a4ff1588fb101c747a07b Maintainer: takagi Status: ready -->
<!-- Credits: mumumu -->
<set xml:id="set.mysqlinfo" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>MySQL ドライバおよびプラグイン</title>
<titleabbrev>MySQL</titleabbrev>
<info xml:id="mysqlinfo.info">
<abstract>
<para>
PHP で MySQL を扱うためのドライバやプラグインには、いくつかの種類があります。
</para>
<para>
それらの違いや MySQL 用拡張モジュールの機能について、ここで簡単に説明します。
</para>
<para>
ここで説明している拡張モジュールは、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> です。
</para>
</abstract>
</info>
<book xml:id="mysql">
<title>MySQL 用 PHP ドライバの概要</title>
<preface xml:id="mysqlinfo.intro">
<title>はじめに</title>
<para>
PHP から MySQL データベースにアクセスするための API は複数あります。
<link linkend="book.mysqli">mysqli</link> あるいは
<link linkend="ref.pdo-mysql">PDO_MySQL</link> が利用できます。
</para>
<para>
このページでは、これらの API についての説明に登場する
<link linkend="mysqlinfo.terminology">用語</link>
について解説したり、
<link linkend="mysqlinfo.api.choosing">いったいどの API を使えばいいのか</link>
を説明したり、選んだ API と組み合わせる MySQL の
<link linkend="mysqlinfo.library.choosing">ライブラリ</link>
について説明したりします。
</para>
</preface>
<chapter xml:id="mysqlinfo.terminology" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>用語説明</title>
<para>
このセクションでは、PHP アプリケーションの開発で MySQL データベースを扱う
ときの選択肢について説明します。
</para>
<para>
<emphasis role="bold">API って何?</emphasis>
</para>
<para>
API は Application Programming Interface の略で、
何らかのタスクを実行するためにアプリケーションから呼び出す必要のある
クラスやメソッド、関数、変数などを定義したものです。
データベースとの通信を必要とする PHP アプリケーションが使うための
API は、通常は PHP の拡張モジュールとして公開されています。
</para>
<para>
API は手続き型にすることもできるし、オブジェクト指向型にすることもできます。
手続き型の API の場合は何かの処理を実行するための関数を呼ぶことになり、
オブジェクト指向型の API の場合はクラスのインスタンスを作ってそのメソッドを呼ぶことになります。
通常は、後者の方法をおすすめします。後者のほうがよりモダンであり、
きっちりとしたコードを書けるからです。
</para>
<para>
MySQL サーバーとの接続が必要な PHP アプリケーションを書く場合に
使える API はいくつかあって、その中から選べます。
このドキュメントでは、どんな API が使えてどれを選ぶのが最適なのかを解説します。
</para>
<para>
<emphasis role="bold">コネクタとは</emphasis>
</para>
<para>
MySQL のドキュメントで使われている <emphasis>コネクタ</emphasis> という用語は、
何かのアプリケーションから MySQL データベースサーバーに接続するためのソフトウェアのことを指します。
MySQL はさまざまな言語用のコネクタを提供しており、PHP もその中に含まれます。
</para>
<para>
PHP のアプリケーションでデータベースサーバーとの通信が必要になったときには、
データベースサーバーへの接続やデータベースへの問い合わせなどの関数を呼ぶ
PHP コードを書くことになるでしょう。つまり、PHP アプリケーションから使える
API を提供するソフトウェアが必要になるということです。
そのソフトウェアは、アプリケーションとデータベースサーバーの間の通信も処理しないといけません。
おそらくは中間ライブラリも利用することになるでしょう。
このソフトウェアのことを一般的にコネクタと呼びます。というのも、このソフトウェアのおかげで
アプリケーションがデータベースサーバーに
<emphasis>接続 (connect)</emphasis> できるようになるからです。
</para>
<para>
<emphasis role="bold">ドライバとは</emphasis>
</para>
<para>
ドライバとは、特定のデータベースサーバーとの通信をするために作られたソフトウェアのことです。
ドライバはライブラリと呼ばれることもあり、
MySQL Client Library や MySQL Native Driver というように使われます。
これらのライブラリが実装するのは低レベルのプロトコルで、
これを使って MySQL データベースサーバーと通信します。
</para>
<para>
例を挙げると、データベース抽象化レイヤーの <link linkend="mysqli.overview.pdo">PHP
Data Objects (PDO)</link> は各データベース専用のドライバの中からひとつを選んで使います。
数あるドライバの中のひとつに PDO MYSQL ドライバがあり、これが
MySQL サーバーとのインターフェイスとなります。
</para>
<para>
人によっては、コネクタとドライバを混同して使うこともあって、混乱の元となります。
MySQL 関連のドキュメントでは、
<quote>コネクタ</quote> という用語はデータベース固有の機能を提供するソフトウェアという意味で
予約されています。
</para>
<para>
<emphasis role="bold">拡張モジュールとは</emphasis>
</para>
<para>
PHP のドキュメントを読んでいると、
<emphasis>拡張モジュール</emphasis> という用語がよく出てきます。
PHP のコードには、コア機能とは別に
オプションの拡張モジュールが用意されています。
PHP で使える MySQL 関連の拡張モジュールには <literal>mysqli</literal> があり、
PHP の拡張モジュール用フレームワークを使って実装されています。
</para>
<para>
拡張モジュールは一般的に PHP プログラマー向けの API を公開しており、
その機能をプログラムから使えるようになっています。
しかし、PHP 拡張モジュールフレームワークを使って書かれた拡張モジュールの中には、
PHP プログラマー向けの API を公開していないものもあります。
</para>
<para>
たとえば PDO MySQL ドライバは PHP の拡張モジュールですが、
それ自体は PHP プログラマー向けの API を公開していません。
さらに上位にある PDO レイヤーへのインターフェイスを提供しているだけです。
</para>
<para>
API と拡張モジュールとは同じ意味ではありません。
拡張モジュールが必ずしもプログラマー向けの API を公開しているとは限らないからです。
</para>
</chapter>
<chapter xml:id="mysqlinfo.api.choosing" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>どの API を使うか</title>
<para>
PHP には、様々な MySQL へ接続する API があります。
以下に、mysqli と PDO が提供する API を示します。
それぞれのコードは、"example.com" 上で稼働する MySQL サーバーに
ユーザー名 "user"、パスワード "password" で接続するものです。
そして、クエリを実行してユーザーにあいさつします。
</para>
<para>
<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>
</para>
<para>
<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>
</para>
<para>
<emphasis role="bold">機能の比較</emphasis>
</para>
<para>
全体的なパフォーマンスは、どれもほぼ同じです。
拡張モジュール自体のパフォーマンスが PHP のウェブリクエストの実行時間に及ぼす影響はごくわずかで、
たいていは 0.1% 程度に過ぎません。
</para>
<informaltable xml:id="mysqlinfo.api.choosing.changelog">
<tgroup cols="3">
<thead>
<row>
<entry></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 xml:id="mysqlinfo.library.choosing" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>どのライブラリを選ぶか</title>
<para>
mysqli、PDO_MySQL といった PHP 拡張モジュールは、
どれも C クライアントライブラリの軽量なラッパーです。これらの拡張モジュールは、
<link linkend="book.mysqlnd">mysqlnd</link> ライブラリあるいは <literal>libmysqlclient</literal>
ライブラリのいずれかを使えます。どちらを使うのかを決めるのは、コンパイル時です。
</para>
<para>
mysqlnd ライブラリは、PHP の一部として配布されています。
遅延接続やクエリのキャッシュなど、libmysqlclient にはない機能も搭載されているので、
この mysqlnd ライブラリを使うことを強くおすすめします。
<link linkend="book.mysqlnd">mysqlnd のドキュメント</link>
には、さらなる詳細情報や機能一覧があります。
</para>
<para>
<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>
</para>
<para>
<emphasis role="bold">ライブラリの機能比較</emphasis>
</para>
<para>
<link linkend="book.mysqlnd">mysqlnd</link> を使うほうが、
MySQL Client Server library (libmysqlclient) よりもおすすめです。
どちらのライブラリも、開発が続いています。
</para>
<informaltable xml:id="mysqlinfo.library.choosing.changelog">
<tgroup cols="3">
<thead>
<row>
<entry></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>