slim入門:Dokcerを利用したRedisの導入

スポンサーリンク
slim入門:Dokcerを利用したRedisの導入 環境構築
slim入門:Dokcerを利用したRedisの導入
この記事は約9分で読めます。
よっしー
よっしー

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

今日は、slim用のローカル開発環境にRedisを導入する方法についてご紹介します。

スポンサーリンク

前提

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

背景

slimで開発しているRESTful APIでRedisを利用するために、Redisを導入する方法についてご紹介します。

修正内容

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

        new file:   app/redis/Dockerfile
        modified:   app/compose.yml
        modified:   app/php-fpm/Dockerfile
        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/redis/Dockerfile

下記の内容で新規作成します。

FROM redis:7.0.11-alpine

app/compose.yml

30行目に追加します。

+  redis:
+    build: ./redis
+    container_name: redis
+    ports:
+      - "6379:6379"
+    networks:
+      - net

app/php-fpm/Dockerfile

7行目に追記します。

+# apt-get update & install
+RUN apt-get update
+
+RUN pecl install redis \
+ && docker-php-ext-enable redis

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

29行目に追記します。

+        Redis::class => function (ContainerInterface $c) {
+            $settings = $c->get(SettingsInterface::class);
+
+            $redisSettings = $settings->get('redis');
+
+            $redis = new Redis();
+            $redis->connect($redisSettings['host'], $redisSettings['port']);
+            return $redis;
+        },

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

27行目に追記します。

+    $app->get('/testredis', function (Request $request, Response $response) {
+        $key = 'key_dummy';
+        $redis = $this->get(Redis::class);
+        if (!$redis->exists($key)) {
+            $redis->set($key, mt_rand(), ['ex'=>10]);
+        }
+        $value = $redis->get($key);
+        $response->getBody()->write($value);
+        return $response;
+    });

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

24行目に追記します。

+                'redis' => [
+                    'host' => 'redis',
+                    'port' => 6379,
+                ],

動作確認

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

make setup
make up

ブラウザから「http://localhost:8080/testredis」にアクセスして、下図のように表示されていれば成功です。

解説

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


このコードは、Redisを使用するための依存性注入(Dependency Injection)の設定を行っています。

コードの内容を詳しく解説すると以下の通りです:

  1. Redis::class => function (ContainerInterface $c):
    • この行は、Redisクラスのインスタンスを生成するための関数を設定しています。
    • この関数は、引数としてContainerInterface型のオブジェクト $c を受け取ります。
  2. $settings = $c->get(SettingsInterface::class):
    • この行では、$cからSettingsInterface::classを取得しています。
    • これは、設定情報を管理するためのインターフェース SettingsInterface の実装クラスのインスタンスを取得しています。
  3. $redisSettings = $settings->get('redis'):
    • SettingsInterfaceのインスタンス $settings を使用して、キーが 'redis' の設定情報を取得しています。
    • これにより、Redisの接続設定情報を取得することができます。
  4. $redis = new Redis():
    • 新しいRedisクラスのインスタンス $redis を作成しています。
  5. $redis->connect($redisSettings['host'], $redisSettings['port']):
    • $redisSettingsから取得したホストとポート情報を使用して、Redisに接続しています。
    • connect()メソッドは、Redisサーバーに接続するためのメソッドです。
  6. return $redis:
    • Redisの接続が確立された後、この関数は作成された$redisインスタンスを返します。

このコードは、依存性注入コンテナ(Dependency Injection Container)の設定部分の一部です。この設定により、Redisクラスを必要とする他のコンポーネントやクラスで、この関数を使用してRedisのインスタンスを取得できます。また、SettingsInterfaceを実装したクラスのインスタンスも必要です。これにより、Redisの接続設定情報を取得できます。

依存性注入を使用することで、コードの柔軟性やテスト容易性が向上します。また、Redisの接続設定を変更する場合にも、この設定部分のみを変更すれば済むため、変更の影響範囲を限定することができます。

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


このコードは、Slim Frameworkを使用して作成されたWebアプリケーションのルートエンドポイント(/testredis)を定義しています。

コードの内容を詳しく解説すると以下の通りです:

  1. $app->get('/testredis', function (Request $request, Response $response):
    • /testredisというパスに対してGETリクエストが送信された場合に、以下の関数が実行されるように設定しています。
    • この関数は、引数としてRequestオブジェクトのインスタンス $requestResponseオブジェクトのインスタンス $response を受け取ります。
  2. $key = 'key_dummy':
    • Redisのキーとして使用するダミーのキー名 'key_dummy' を変数 $key に代入しています。
  3. $redis = $this->get(Redis::class):
    • 依存性注入コンテナからRedis::class(Redisのインスタンス)を取得し、変数 $redis に代入しています。
    • これにより、このルートハンドラ内でRedisにアクセスできるようになります。
  4. if (!$redis->exists($key)) { ... }:
    • Redisのexists()メソッドを使用して、キーが存在するかどうかをチェックしています。
    • もしキーが存在しない場合(exists()の戻り値がfalseの場合)、以下の処理が実行されます。
  5. $redis->set($key, mt_rand(), ['ex'=>10]):
    • Redisのset()メソッドを使用して、キーとランダムな値をRedisに設定しています。
    • 第3引数の連想配列 ['ex'=>10] は、キーの有効期限を10秒に設定するためのオプションです。
  6. $value = $redis->get($key):
    • Redisのget()メソッドを使用して、指定したキーの値を取得し、変数 $value に代入しています。
  7. $response->getBody()->write($value):
    • レスポンスオブジェクト $response のボディに、Redisから取得した値を書き込んでいます。
  8. return $response:
    • 処理が完了したレスポンスオブジェクト $response を返します。

このコードは、/testredisへのGETリクエストに対して、Redisを使用してダミーのキーと値を設定し、それをレスポンスとして返すエンドポイントです。存在しないキーの場合は、ランダムな値をキーに設定して有効期限を10秒に設定します。存在するキーの場合は、そのキーの値を取得してレスポンスとして返します。

おわりに

今日は、slim用のローカル開発環境にRedisを導入する方法についてご紹介しました。

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

よっしー
よっしー

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

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

コメント

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