slim入門:Dockerで構築したMariaDBのRead Replicaへのアクセス

スポンサーリンク
slim入門:Dockerで構築したMariaDBのRead Replicaへのアクセス 環境構築
slim入門:Dockerで構築したMariaDBのRead Replicaへのアクセス
この記事は約10分で読めます。
よっしー
よっしー

こんにちは。よっしーです(^^)

今日は、先日作成したReadReplicaへの接続方法についてご紹介します。

スポンサーリンク

前提

この記事は下記の記事をベースにしています。

背景

先日、DockerでMariaDBのReadReplicaを構築しましたので、この記事では構築したReadReplicaに接続するコードをご紹介します。

修正内容

下記のファイルを更新します。下記の各セクションに各ファイルの修正内容を記載しています。

        modified:   app/php-fpm/slim_app/.env
        modified:   app/php-fpm/slim_app/app/dependencies.php
        modified:   app/php-fpm/slim_app/app/routes.php
        modified:   app/php-fpm/slim_app/app/settings.php

app/php-fpm/slim_app/.env

12行目に追加します。

+MARIADB_READ_HOST=mariadb_read
+MARIADB_READ_PORT=3306
+MARIADB_READ_DBNAME=sample
+MARIADB_READ_CHARSET=utf8mb4
+MARIADB_READ_USER=app_user
+MARIADB_READ_PASS=P@ssw0rd

app/php-fpm/slim_app/app/settings.php

37行目に追加します。

+                'mariadb_read' => [
+                    'host'    => $_ENV['MARIADB_READ_HOST'],
+                    'port'    => $_ENV['MARIADB_READ_PORT'],
+                    'dbname'  => $_ENV['MARIADB_READ_DBNAME'],
+                    'charset' => $_ENV['MARIADB_READ_CHARSET'],
+                    'user'    => $_ENV['MARIADB_READ_USER'],
+                    'pass'    => $_ENV['MARIADB_READ_PASS'],
+                ],

app/php-fpm/slim_app/app/dependencies.php

61行目に追加します。

+        'db_read' => function (ContainerInterface $c) {
+            $settings = $c->get(SettingsInterface::class);
+
+            $mariadbSettings = $settings->get('mariadb_read');
+
+            //PDO設定
+            $host    = $mariadbSettings['host'];
+            $port    = $mariadbSettings['port'];
+            $dbname  = $mariadbSettings['dbname'];
+            $charset = $mariadbSettings['charset'];
+            $user    = $mariadbSettings['user'];
+            $pass    = $mariadbSettings['pass'];
+            $option = array(
+                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
+                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
+                PDO::ATTR_EMULATE_PREPARES => true,
+                PDO::ATTR_STRINGIFY_FETCHES => false,
+            );
+            $dsn = sprintf('mysql:host=%s;port=%s;dbname=%s;charset=%s;', $host, $port, $dbname, $charset);
+
+            $pdo = new \PDO($dsn, $user, $pass, $option);
+            return $pdo;
+        },

app/php-fpm/slim_app/app/routes.php

47行目に追加します。

+    $app->get('/testmariadb_read', function (Request $request, Response $response) {
+        $pdo = $this->get('db_read');
+        $stmt = $pdo->query('SELECT * from `sample`');
+        $data = $stmt->fetchAll();
+        $json = json_encode($data, JSON_PRETTY_PRINT);
+        $response->getBody()->write($json);
+        return $response;
+    });

動作確認

下記のコマンドを実行します。

make up
make migrate_up

下記のコマンドを実行します。

curl -Lk http://localhost/testmariadb_read

下記のような出力なっていれば成功です。

% curl -Lk http://localhost/testmariadb_read
[
    {
        "id": 1,
        "title": "test 1",
        "created_at": "2023-07-17 05:44:09"
    }
]

解説

app/php-fpm/slim_app/app/settings.php

このコードは、MariaDB(MySQL互換のリレーショナルデータベース管理システム)への読み取り操作に必要な接続情報を保持する配列を定義しています。配列のキーは次のような要素で構成されています。

  • 'host':MariaDBサーバーのホスト名またはIPアドレスが$_ENV['MARIADB_READ_HOST']から取得されます。$_ENVは環境変数にアクセスするためのPHPの組み込み変数です。
  • 'port':MariaDBサーバーのポート番号が$_ENV['MARIADB_READ_PORT']から取得されます。
  • 'dbname':データベース名が$_ENV['MARIADB_READ_DBNAME']から取得されます。
  • 'charset':データベースの文字セットが$_ENV['MARIADB_READ_CHARSET']から取得されます。
  • 'user':データベースに接続するためのユーザー名が$_ENV['MARIADB_READ_USER']から取得されます。
  • 'pass':データベースに接続するためのパスワードが$_ENV['MARIADB_READ_PASS']から取得されます。

この配列は、データベース接続を確立するために使用される情報をまとめて保持します。実際の接続処理では、この配列の値が使用され、指定されたホスト、ポート、データベース、文字セット、ユーザー名、およびパスワードを使用してMariaDBサーバーに接続します。

app/php-fpm/slim_app/app/dependencies.php


このコードは、依存性注入コンテナ(Dependency Injection Container)内で定義されたdb_readというキーのエントリです。このエントリは、読み取り操作に使用されるMariaDB(MySQL互換のリレーショナルデータベース管理システム)への接続を作成するための無名関数(クロージャ)を定義しています。

関数の引数$cContainerInterface型のインスタンスであり、依存性注入コンテナ自体を表しています。このコンテナは他のオブジェクトやサービスのインスタンスを管理し、必要に応じて取得できるようにします。

関数内のコードの概要は以下の通りです:

  1. 依存性注入コンテナからSettingsInterface型のインスタンスを取得します。これにより、アプリケーションの設定情報にアクセスできます。
  2. 取得した設定情報から、mariadb_readというキーに関連付けられた設定を取得します。これにより、MariaDBへの接続に必要な情報を取得できます。
  3. PDO(PHP Data Objects)の設定を定義します。これにはエラーモード、フェッチモード、プリペアドステートメントのエミュレーションなどのオプションが含まれます。
  4. 接続文字列(DSN)を作成します。これは、データベースのホスト名、ポート番号、データベース名、および文字セットを指定します。
  5. PDOオブジェクトを作成し、指定された接続情報を使用してMariaDBサーバーに接続します。
  6. 最後に、作成されたPDOオブジェクトを返します。

このエントリをコンテナに登録することで、アプリケーション内の他の場所でdb_readキーを使用してPDOオブジェクトを取得することができます。これにより、データベースへの読み取り操作を行う際に再利用できる便利なメカニズムが提供されます。

app/php-fpm/slim_app/app/routes.php

このコードは、Slim Frameworkアプリケーション内でHTTP GETリクエストが/testmariadb_readパスに送信された場合に実行されるハンドラ関数(コールバック関数)を定義しています。

ハンドラ関数の引数$requestRequest型のインスタンスで、受信したHTTPリクエストに関する情報を持っています。$responseResponse型のインスタンスで、レスポンスの生成と送信に使用されます。

関数内のコードの概要は以下の通りです:

  1. 依存性注入コンテナからdb_readというキーを使用してPDOオブジェクトを取得します。これにより、読み取り操作のためにMariaDBに接続する準備が整います。
  2. SELECT * FROM sample というSQLクエリを実行するために、PDOオブジェクトからステートメント($stmt)を取得します。
  3. $stmt->fetchAll()を使用して、クエリの結果セットのすべての行を連想配列の形式で取得します。
  4. $data配列をjson_encode()関数を使用してJSON形式の文字列に変換します。JSON_PRETTY_PRINTフラグは、生成されたJSONを読みやすい形式で整形するために使用されます。
  5. レスポンスオブジェクトのボディにJSONデータを書き込みます。
  6. 最後に、レスポンスオブジェクトを返します。

このハンドラ関数は、/testmariadb_readパスにアクセスされた際に、MariaDBデータベースからデータを読み取り、JSON形式で応答を返す役割を担っています。Slim Frameworkによって提供されるルーティング機能を使用して、このハンドラ関数が正しいパスで呼び出されるように設定することができます。

おわりに

今日は、先日作成したReadReplicaへの接続方法についてご紹介しました。

本記事でご紹介したソースは、下記のリポジトリにあります。

よっしー
よっしー

何か質問や相談があれば、遠慮なくコメントしてください。また、エンジニア案件についても、いつでも相談にのっていますので、お気軽にお問い合わせください。

それでは、また明日お会いしましょう(^^)

コメント

タイトルとURLをコピーしました