接続、および接続の管理
PDO 基底クラスのインスタンスを作成することにより、接続が確立されます。
どのドライバを使用するのかにかかわらず、常に PDO クラスを指定します。
コンストラクタに渡す引数により、データソース (いわゆる DSN) の指定や
(もしあれば、オプションで) ユーザー名およびパスワードの指定を行います。
例1 MySQL への接続
<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
?>
接続時になんらかのエラーが発生した場合、PDOException
オブジェクトがスローされます。エラー処理を行いたい場合はこの例外を
キャッチします。あるいはこれを無視して、
set_exception_handler で設定した
グローバル例外ハンドラに処理を任せることもできます。
例2 接続エラーの処理
<?php
try {
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
} catch (PDOException $e) {
// たとえば、タイムアウトしたあとに再接続を試みます
}
?>
警告
他の 例外 と同様に、
PDOException は catch を使って
明示的にキャッチすることもできますし、
set_exception_handler を使って暗黙的にキャッチすることもできます。
そうしない場合、例外をキャッチしない場合のデフォルトの動作として
E_FATAL_ERROR が発生します。
この致命的なエラーはデータベース接続の詳細を含むバックトレースを含みます。
このバックトレースを見れば、データベースへの接続の詳細がわかってしまいます。
そのため、本番環境のサーバーでは、
php.ini の display_errors を 0 に設定しておきましょう。
データベースへの接続に成功すると、PDO クラスのインスタンスが
スクリプトに返されます。この PDO オブジェクトが存在する間、
接続がアクティブであり続けます。接続を閉じるには、他から
参照されていないことを保障することでオブジェクトを破棄する
必要があります。それには、オブジェクトを保持している変数に対して
null を代入します。
明示的にこれを行わなかった場合は、スクリプトの終了時に自動的に
接続が閉じられます。
注意:
この PDO インスタンスへの参照
(PDOStatement インスタンスからの参照や、同じ PDO インスタンスを参照する別の変数からの参照など)
が他にも残っているなら、それらもあわせて削除する必要があります
(PDOStatement を参照する変数に null を代入するなど)。
例3 接続を閉じる
<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
// ここで接続を使用します
$sth = $dbh->query('SELECT * FROM foo');
// 使用を終了したので、閉じます
$sth = null;
$dbh = null;
?>
データベースサーバーへの持続的な接続による恩恵をこうむる web
アプリケーションは多いでしょう。持続的な接続は、スクリプトが
終了しても閉じられずにキャッシュされ、他のスクリプトが同じ内容の
接続を要求してきた際にそれが再利用されます。持続的接続の
キャッシュにより、スクリプトがデータベースを使用するたびに
新しい接続を確立するオーバーヘッドを避けることができます。
それにより、結果として web アプリケーションを高速化できるように
なります。
例4 持続的な接続
<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(
PDO::ATTR_PERSISTENT => true
));
?>
PDO::ATTR_PERSISTENT オプションの値は、
数値でない string の値が設定されない限り、(持続的な接続が有効/無効かを示す)
bool に変換されます。
数値でない string を設定する場合、複数の接続プールを使うことができます。
これは互換性がない異なる接続設定を使う場合に便利です。たとえば、
異なる PDO::MYSQL_ATTR_USE_BUFFERED_QUERY の値を設定する場合が挙げられます。
注意:
持続的な接続を使用したい場合は、ドライバのオプションを表す配列に
PDO::ATTR_PERSISTENT を設定して
PDO のコンストラクタに渡す必要があります。この属性を
PDO::setAttribute
を用いてインスタンス作成後に設定した場合は、
そのドライバは持続的な接続を使用しません。
警告
PDO は、持続的接続のクリーンアップを一切行いません。
一時テーブル、ロック、トランザクション、その他の状態依存の変更が、
接続の以前の使用から残存し、予期せぬ問題を引き起こす可能性があります。
詳細については、
持続的データベース接続
を参照ください。
注意:
PDO ODBC ドライバを使用しており、ODBC ライブラリが ODBC
接続プーリングをサポートしている場合 (unixODBC および Windows
はこれをサポートしています。他にもあるかもしれません) は、
PDO の持続的接続を使用せずに ODBC の接続プーリングに
接続キャッシュ処理を任せることを推奨します。
ODBC の接続プールは、プロセス内で他のモジュールと共有されています。
PDO が接続をキャッシュしてしまうと、その接続は ODBC の
接続プールに返されなくなり、他のモジュールによって新たな接続が
作成されてしまうようになります。