こんにちは。よっしーです(^^)
今日は、先日作成した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互換のリレーショナルデータベース管理システム)への接続を作成するための無名関数(クロージャ)を定義しています。
関数の引数$c
はContainerInterface
型のインスタンスであり、依存性注入コンテナ自体を表しています。このコンテナは他のオブジェクトやサービスのインスタンスを管理し、必要に応じて取得できるようにします。
関数内のコードの概要は以下の通りです:
- 依存性注入コンテナから
SettingsInterface
型のインスタンスを取得します。これにより、アプリケーションの設定情報にアクセスできます。 - 取得した設定情報から、
mariadb_read
というキーに関連付けられた設定を取得します。これにより、MariaDBへの接続に必要な情報を取得できます。 - PDO(PHP Data Objects)の設定を定義します。これにはエラーモード、フェッチモード、プリペアドステートメントのエミュレーションなどのオプションが含まれます。
- 接続文字列(DSN)を作成します。これは、データベースのホスト名、ポート番号、データベース名、および文字セットを指定します。
- PDOオブジェクトを作成し、指定された接続情報を使用してMariaDBサーバーに接続します。
- 最後に、作成されたPDOオブジェクトを返します。
このエントリをコンテナに登録することで、アプリケーション内の他の場所でdb_read
キーを使用してPDOオブジェクトを取得することができます。これにより、データベースへの読み取り操作を行う際に再利用できる便利なメカニズムが提供されます。
app/php-fpm/slim_app/app/routes.php
このコードは、Slim Frameworkアプリケーション内でHTTP GETリクエストが/testmariadb_read
パスに送信された場合に実行されるハンドラ関数(コールバック関数)を定義しています。
ハンドラ関数の引数$request
はRequest
型のインスタンスで、受信したHTTPリクエストに関する情報を持っています。$response
はResponse
型のインスタンスで、レスポンスの生成と送信に使用されます。
関数内のコードの概要は以下の通りです:
- 依存性注入コンテナから
db_read
というキーを使用してPDOオブジェクトを取得します。これにより、読み取り操作のためにMariaDBに接続する準備が整います。 SELECT * FROM
sample というSQLクエリを実行するために、PDOオブジェクトからステートメント($stmt
)を取得します。$stmt->fetchAll()
を使用して、クエリの結果セットのすべての行を連想配列の形式で取得します。$data
配列をjson_encode()
関数を使用してJSON形式の文字列に変換します。JSON_PRETTY_PRINT
フラグは、生成されたJSONを読みやすい形式で整形するために使用されます。- レスポンスオブジェクトのボディにJSONデータを書き込みます。
- 最後に、レスポンスオブジェクトを返します。
このハンドラ関数は、/testmariadb_read
パスにアクセスされた際に、MariaDBデータベースからデータを読み取り、JSON形式で応答を返す役割を担っています。Slim Frameworkによって提供されるルーティング機能を使用して、このハンドラ関数が正しいパスで呼び出されるように設定することができます。
おわりに
今日は、先日作成したReadReplicaへの接続方法についてご紹介しました。
本記事でご紹介したソースは、下記のリポジトリにあります。
何か質問や相談があれば、遠慮なくコメントしてください。また、エンジニア案件についても、いつでも相談にのっていますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント