Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】PDO::ATTR_PERSISTENT定数の使い方

ATTR_PERSISTENT定数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

ATTR_PERSISTENT定数は、PHPのPDO拡張機能において、データベースへの永続的な接続を制御するために使用される定数です。

PHPアプリケーションがデータベースにアクセスする際、通常はリクエストごとにデータベース接続を確立し、スクリプトの実行が終了するとその接続は切断されます。しかし、高頻度でデータベースアクセスが必要なウェブアプリケーションなどでは、この接続の確立と切断の繰り返しがパフォーマンス上のオーバーヘッドとなることがあります。

この定数にtrueを設定してPDOオブジェクトを生成することで、PHPプロセスが終了した後もデータベースとの接続を維持する「永続接続」が有効になります。永続接続が有効になると、次に同じデータベースへの接続が必要になった際に、既存の接続が再利用されるため、接続確立にかかる時間を削減し、アプリケーション全体のパフォーマンス向上に貢献します。

設定は、new PDO($dsn, $user, $password, [PDO::ATTR_PERSISTENT => true]);のように、PDOクラスのコンストラクタオプションとして指定することが一般的です。

ただし、永続接続はサーバーのリソースを継続的に消費するため、その管理には注意が必要です。不適切な利用は、データベースサーバーのリソース枯渇を招く可能性があります。また、以前の接続で設定されたトランザクションの状態や、セッション固有の情報が次回の接続に引き継がれることもあり得るため、予期せぬ動作を避けるためにはアプリケーションの設計に十分な注意が必要です。性能向上というメリットの一方で、これらのリスクも存在するため、特性を理解した上で慎重な導入が推奨されます。

構文(syntax)

1<?php
2$dsn = 'mysql:host=localhost;dbname=testdb';
3$user = 'your_username';
4$password = 'your_password';
5
6$options = [
7    PDO::ATTR_PERSISTENT => true,
8];
9
10try {
11    $pdo = new PDO($dsn, $user, $password, $options);
12} catch (PDOException $e) {
13    // 接続エラー処理
14}

引数(parameters)

引数なし

引数はありません

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHP PDO::ATTR_PERSISTENTで永続接続を確立する

1<?php
2
3/**
4 * PDO::ATTR_PERSISTENT を使用して永続的なデータベース接続を確立する関数。
5 *
6 * PDO::ATTR_PERSISTENT は、PHPスクリプトの実行が終了してもデータベース接続を閉じず、
7 * そのPHPプロセスが生きている限り接続を再利用できるようにするオプションです。
8 * これにより、接続確立のオーバーヘッドを削減できますが、リソース管理に注意が必要です。
9 *
10 * @return PDO|null 成功した場合はPDOオブジェクト、失敗した場合はnullを返します。
11 */
12function establishPersistentDatabaseConnection(): ?PDO
13{
14    // データベース接続設定
15    // 実際のアプリケーションでは、これらの値を設定ファイルや環境変数から読み込むことが推奨されます。
16    // ここではMySQLを想定したDSNを使用していますが、他のデータベースに変更可能です。
17    $dsn = 'mysql:host=localhost;dbname=testdb;charset=utf8mb4';
18    $user = 'your_db_user';     // データベースのユーザー名に置き換えてください
19    $password = 'your_db_password'; // データベースのパスワードに置き換えてください
20
21    // PDO接続オプションの設定
22    $options = [
23        // エラーモードを例外に設定し、データベース操作のエラーが発生した場合にPDOExceptionをスローする
24        PDO::ATTR_ERRMODE          => PDO::ERRMODE_EXCEPTION,
25        // デフォルトのフェッチモードを連想配列に設定し、クエリ結果を扱いやすくする
26        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
27        // プリペアドステートメントのエミュレーションを無効化し、セキュリティとパフォーマンスを向上させる
28        PDO::ATTR_EMULATE_PREPARES => false,
29        // ここで PDO::ATTR_PERSISTENT を true に設定することで、永続接続を有効にする
30        // この接続は、PHPプロセスが再利用可能な限りオープンなまま保持されます。
31        PDO::ATTR_PERSISTENT       => true,
32    ];
33
34    try {
35        // PDOオブジェクトを生成し、指定されたDSN、ユーザー、パスワード、オプションでデータベースに接続を試みる
36        $pdo = new PDO($dsn, $user, $password, $options);
37        echo "データベースに永続接続を確立しました。\n";
38        return $pdo;
39    } catch (PDOException $e) {
40        // 接続失敗時のエラーハンドリング
41        // 開発時には詳細なエラーメッセージを表示しても良いですが、本番環境ではセキュリティのためログに記録し、
42        // ユーザーには一般的なエラーメッセージを表示することが推奨されます。
43        echo "データベース接続エラー: " . $e->getMessage() . "\n";
44        return null;
45    }
46}
47
48// 上記の関数を呼び出して永続的なPDO接続を取得します。
49$pdoConnection = establishPersistentDatabaseConnection();
50
51// 接続が成功したかどうかを確認し、その後のデータベース操作を行います。
52if ($pdoConnection) {
53    echo "PDOオブジェクトが正常に生成され、データベース操作の準備ができました。\n";
54    // 例: ここで $pdoConnection を使用してSQLクエリを実行できます。
55    /*
56    try {
57        $stmt = $pdoConnection->query("SELECT * FROM users LIMIT 1");
58        $user = $stmt->fetch();
59        if ($user) {
60            echo "ユーザーデータの一例: " . print_r($user, true) . "\n";
61        } else {
62            echo "ユーザーデータが見つかりませんでした。\n";
63        }
64    } catch (PDOException $e) {
65        echo "クエリ実行エラー: " . $e->getMessage() . "\n";
66    }
67    */
68} else {
69    echo "データベースへの永続接続の確立に失敗しました。\n";
70}
71
72// 永続接続はスクリプトの終了時に自動的に閉じられないため、
73// 明示的な $pdo = null; は厳密には不要ですが、オブジェクトを解放する意図を示すために記述することもできます。
74// ただし、永続接続の目的と矛盾するため、通常は行いません。
75
76?>

このサンプルコードは、PHPのPDO::ATTR_PERSISTENT定数を利用して、永続的なデータベース接続を確立する方法を示しています。PDO::ATTR_PERSISTENTは、PDO(PHP Data Objects)接続時に設定するオプションの一つで、この定数をtrueに設定すると、PHPスクリプトの実行が終了してもデータベース接続が閉じずに保持されます。これにより、同じPHPプロセス(例えばWebサーバーのプロセス)が再利用される場合、次回接続を試みる際に新たな接続を確立する手間を省き、既存の接続を再利用することができます。

この永続接続は、データベース接続の確立にかかるオーバーヘッドを削減し、アプリケーション全体のパフォーマンス向上に寄与します。ただし、接続が常にオープンな状態を保つため、データベースサーバー側の接続リソース管理に注意が必要です。

サンプルコードのestablishPersistentDatabaseConnection関数は、データベース接続に必要なDSN、ユーザー名、パスワードなどの情報を内部で設定し、PDO::ATTR_PERSISTENT => trueを含むオプションを指定してPDOオブジェクトの生成を試みます。この関数には明示的な引数はありません。接続が成功した場合は、その後のデータベース操作に使用できるPDOオブジェクトを戻り値として返し、接続に失敗した場合はnullを返します。これにより、エラー発生時の対応も容易になります。

PDO::ATTR_PERSISTENTは、データベース接続の再利用によりアプリケーションの高速化を図る機能ですが、利用にはいくつかの注意点があります。この設定を有効にすると、PHPスクリプト終了後もデータベース接続が閉じられず、PHPプロセスが生きている限り維持されます。そのため、データベース側の接続数上限に達しやすくなるため、リソース管理を慎重に行ってください。また、永続接続では前回のリクエストの状態が引き継がれる可能性があるため、トランザクションの未コミットなどがないか、接続再利用時に毎回確認し、必要に応じてリセットする処理を検討することが重要です。セキュリティのため、データベースの認証情報はコードに直接記述せず、設定ファイルや環境変数で管理しましょう。エラーメッセージは本番環境ではユーザーに詳細を表示せず、ログに記録するよう運用してください。

関連コンテンツ