CodeIgniterでRedisセッションを導入する方法!高速化と安定性を手に入れる
生徒
「CodeIgniterでWebサイトを作っているのですが、アクセスが増えても動きを速くする方法はありますか?」
先生
「それなら『Redis』を使ってセッション管理をするのがおすすめですよ。データの読み書きが劇的に速くなります。」
生徒
「レディス…?難しそうですね。初心者でも設定できるんでしょうか?」
先生
「大丈夫です。CodeIgniterには便利な仕組みが備わっているので、基本を理解すれば誰でも導入できます。一緒に手順を見ていきましょう!」
1. セッションとRedisの基本を知ろう
まず、セッション(Session)とは何かを説明します。Webサイトを見ているとき、ログイン状態を維持したり、ショッピングカートの中身を保存したりするために、サーバー側に一時的に保存される情報のことを「セッション」と呼びます。通常、CodeIgniter(コードイグナイター)では、この情報をサーバーの中にある「ファイル」として保存します。
しかし、たくさんの人が同時にサイトにアクセスすると、ファイルを読み書きする順番待ちが発生し、動作が重くなってしまいます。そこで登場するのがRedis(レディス)です。Redisは、パソコンの「メモリ」という、非常にデータの出し入れが速い場所に情報を保存する仕組みです。ハードディスクやSSDに書き込むファイル形式よりも圧倒的にスピードが速いため、Webサイトの高速化に直結します。プログラミング初心者の方でも、今のうちにこの「高速な貯蔵庫」の使い方を知っておくと、将来プロのエンジニアとして一歩リードできますよ。
2. Redisを使うための準備:サーバーの設定
Redisを使うためには、まずあなたの開発環境やサーバーにRedisそのものがインストールされている必要があります。これは、テレビを見るためにテレビ本体を買ってくるのと同じです。また、PHPというプログラミング言語からRedisを操作するための「phpredis」という拡張機能(追加パーツのようなもの)も必要になります。
もし自分でサーバーを立てている場合は、コマンドラインでインストール作業を行いますが、レンタルサーバーやクラウド環境(AWSやGCPなど)を使っている場合は、管理画面からポチッとボタンを押すだけで有効にできることも多いです。まずは自分の環境でRedisが使える状態かどうかを確認してみましょう。これが準備の第一歩です。
3. CodeIgniterの設定ファイルを確認しよう
準備ができたら、いよいよCodeIgniterの設定を変更していきます。編集するファイルは app/Config/App.php というファイルです。このファイルには、Webサイトの全体的なルールが書かれています。ここで「これからはセッションをファイルではなくRedisに保存するよ!」と教えてあげる必要があります。
具体的には、public string $sessionDriver という項目を探します。ここが初期状態では FileHandler になっているはずなので、これを書き換えていきます。コードを書くときは、綴り(スペル)を間違えないように注意してくださいね。1文字でも違うと、プログラムは「そんな場所知らないよ!」と怒って動かなくなってしまいます。
4. 設定ファイルの書き換え:実践編
それでは、実際に設定ファイルを書き換えてみましょう。まずは一番シンプルな設定方法です。sessionDriver に RedisHandler を指定し、保存先を指定します。保存先(savePath)には、Redisが動いている場所の住所(IPアドレスやホスト名)と、通信するための窓口番号(ポート番号)を記述します。
// app/Config/App.php の中の設定例
public string $sessionDriver = \CodeIgniter\Session\Handlers\RedisHandler::class;
// Redisサーバーの場所を指定します(通常は localhost と 6379 番ポート)
public string $sessionSavePath = 'tcp://127.0.0.1:6379';
この tcp://127.0.0.1:6379 という書き方は、自分のパソコン(127.0.0.1)の中にある、Redis専用の入り口(6379番)を使ってね、という意味になります。インターネット上の住所のようなものだと考えると分かりやすいですね。これを設定するだけで、CodeIgniterは自動的にRedisと通信を始めてくれます。
5. パスワードが必要な場合の設定
セキュリティを高めるために、Redisにパスワードをかけている場合があります。家の鍵をかけるのと同じですね。その場合は、保存先の書き方にパスワードを含める必要があります。もしパスワードを設定しているのにこれを忘れると、接続に失敗して画面にエラーが出てしまいます。初心者の方が一番つまづきやすいポイントなので、しっかりチェックしましょう。
// パスワードがある場合の書き方例
// auth@ の後ろにパスワードを書きます
public string $sessionSavePath = 'tcp://127.0.0.1:6379?auth=your_password_here';
your_password_here の部分を、実際に設定したパスワードに書き換えてください。このように、URLのような形式で設定を付け加えることができるのがCodeIgniterの便利なところです。難しく感じたら、「おまじない」だと思って形を真似するところから始めてみましょう。
6. 複数のデータベースを使い分ける
Redisには、データを保存する「引き出し」がいくつか用意されています。これをデータベース番号と呼び、0番から15番まであるのが一般的です。他のプログラムでもRedisを使っている場合、データが混ざらないようにセッション専用の引き出しを指定することができます。これを指定しないと、デフォルトの0番が使われます。
// データベース番号を指定する場合(例:データベース5番を使う)
public string $sessionSavePath = 'tcp://127.0.0.1:6379?database=5';
複数のアプリを同じサーバーで動かしているときに便利なテクニックです。プログラミングに慣れてくると、「整理整頓」がいかに大切かが分かってきます。今のうちから、データを分けて管理するという意識を持っておくと、将来のバグ(プログラムのミス)を防ぐことにつながります。
7. 実際にセッションを使ってみる
設定が終わったら、正しく動いているかテストしてみましょう。コントローラー(プログラムの実行役)でセッションに値を保存し、次のページでその値が表示されるかを確認します。Redisに保存されているかどうかは、見た目上はファイル保存のときと変わりませんが、裏側では爆速で処理が行われています。
// データを保存するプログラムの例
public function setSession()
{
$session = session();
$session->set('user_name', 'プログラミング初心者さん');
echo 'セッションに名前を保存しました!';
}
このコードを実行すると、ブラウザには「セッションに名前を保存しました!」と表示されます。このとき、サーバーのメモリ内(Redis)には user_name という鍵と一緒に プログラミング初心者さん という文字が大切に保管されています。
8. 保存したデータを読み出す
次に、保存したデータを取り出してみましょう。別の関数やページで、先ほど保存した「名前」を呼び出します。これができれば、Redisでのセッション管理は完璧にマスターしたと言えます!
// データを取り出すプログラムの例
public function getSession()
{
$session = session();
$userName = $session->get('user_name');
if ($userName) {
echo 'こんにちは、' . $userName . 'さん!';
} else {
echo '名前が登録されていません。';
}
}
もし画面に「こんにちは、プログラミング初心者さん!」と表示されれば成功です!ファイルを使っていたときと同じ書き方で、保存先だけをRedisに変えられるのがCodeIgniterの凄いところです。プログラム本体を書き換える必要がないので、開発がとても楽になりますね。
9. Redisを使うメリットを再確認しよう
最後に、なぜ苦労して(と言っても設定は簡単でしたが!)Redisを導入したのか、その理由を整理しましょう。最大の特徴は、最初に述べた「スピード」です。特に数千人、数万人が同時に訪れるサイトでは、ファイル保存だとサーバーが悲鳴を上げて止まってしまうことがありますが、Redisなら涼しい顔で処理をこなしてくれます。
また、複数のサーバーで一つのサイトを動かす「分散環境」でもRedisは威力を発揮します。どのサーバーにアクセスしても、共通のRedisサーバーを見に行けば、同じセッション情報を取り出せるからです。これは、現代の大きなWebサービスを作る上では欠かせない技術です。パソコンを触ったことがない方でも、「すごい魔法の倉庫を使ったんだな」と感じていただければ十分です。一歩ずつ、確実に知識を積み重ねていきましょう。