セッションライブラリ

セッションクラスを使用すると、ユーザーの「状態」を維持し、サイトを閲覧している間の彼らのアクティビティを追跡できます。

CodeIgniter には、目次最後のセクションに示されているように、いくつかのセッションストレージドライバが付属しています。

セッションクラスの使用

セッションの初期化

セッションは通常、各ページの読み込みでグローバルに実行されるため、セッションクラスは自動的に初期化されるはずです。

セッションにアクセスして初期化するには

<?php

$session = \Config\Services::session($config);

$config パラメーターはオプションです - アプリケーションの設定です。提供されない場合、サービスレジスタはデフォルトのものをインスタンス化します。

読み込まれたら、セッションライブラリオブジェクトは以下を使用して利用できます。

$session

あるいは、デフォルトの設定オプションを使用するヘルパー関数を使用することもできます。このバージョンは少し読みやすいですが、設定オプションは使用しません。

<?php

$session = session();

セッションの仕組み

ページが読み込まれると、セッションクラスは、有効なセッション Cookie がユーザーのブラウザによって送信されているかどうかを確認します。セッション Cookie が存在しない場合 (またはサーバーに保存されている Cookie と一致しない場合、または有効期限が切れている場合)、新しいセッションが作成されて保存されます。

有効なセッションが存在する場合、その情報は更新されます。更新ごとに、設定されている場合、セッション ID が再生成される場合があります。

初期化されると、セッションクラスは自動的に実行されることを理解することが重要です。上記の動作を起こすために必要なことは何もありません。以下で説明するように、セッションデータを操作できますが、セッションの読み取り、書き込み、更新のプロセスは自動的に行われます。

注記

CLI では、セッションライブラリは HTTP プロトコルに基づいた概念であるため、自動的に停止します。

同時実行性に関する注意事項

大量の AJAX を使用する Web サイトを開発していない限り、このセクションはスキップできます。ただし、開発していて、パフォーマンスの問題が発生している場合は、この注意事項がまさに探しているものです。

CodeIgniter v2.x のセッションはロックを実装していませんでした。つまり、同じセッションを使用する 2 つの HTTP リクエストが同時に実行される可能性がありました。より適切な技術用語を使用すると、リクエストはノンブロッキングでした。

ただし、セッションのコンテキストでのノンブロッキングリクエストは安全ではないことも意味します。これは、1 つのリクエストでのセッションデータの変更 (またはセッション ID の再生成) が、2 番目の同時リクエストの実行を妨害する可能性があるためです。この詳細は、多くの問題の根本原因であり、CodeIgniter 3 にセッションライブラリが完全に書き直された主な理由です。

なぜこれを教えているのでしょうか? パフォーマンスの問題の原因を見つけようとした後、ロックが問題であると結論付け、ロックを削除する方法を検討する可能性があるためです…

それをしないでください! ロックを削除するのは**間違っています**。さらに問題が発生します!

ロックは問題ではなく、解決策です。問題は、セッションを既に処理し終えているため、もはや必要ないにもかかわらず、セッションを開いたままにしていることです。したがって、必要なのは、現在のリクエストのセッションが不要になった後に、それを閉じることです。

<?php

$session->close();

セッションデータとは

セッションデータは、特定のセッション ID (Cookie) に関連付けられた単純な配列です。

以前に PHP でセッションを使用している場合は、PHP の $_SESSION スーパーグローバル に精通しているはずです (そうでない場合は、そのリンクのコンテンツを読んでください)。

CodeIgniter は、PHP によって提供されるセッションハンドラのメカニズムを使用しているため、同じ方法でセッションデータにアクセスできます。セッションデータの使用は、$_SESSION 配列を操作 (値の読み取り、設定、設定解除) するのと同じくらい簡単です。

注記

一般に、グローバル変数を使用するのは悪い習慣です。したがって、スーパーグローバル $_SESSION を直接使用することはお勧めしません.

さらに、CodeIgniter は、以下で詳しく説明する 2 つの特別なタイプのセッションデータも提供します。フラッシュデータ一時データ です。

注記

歴史的な理由から、フラッシュデータと一時データを除くセッションデータを「ユーザーデータ」と呼びます。

セッションデータの取得

セッション配列からの情報はすべて、$_SESSION スーパーグローバルを通じて利用できます。

<?php

$item = $_SESSION['item'];

または、従来のアクセサーメソッドを通じて

<?php

$item = $session->get('item');

または、マジックゲッターを通じて

<?php

$item = $session->item;

または、セッションヘルパーメソッドを通じて

<?php

$item = session('item');

ここで、item は、取得したい項目に対応する配列キーです。たとえば、以前に保存された name 項目を $name 変数に割り当てるには、次のようにします。

<?php

$name = $_SESSION['name'];

// or:

$name = $session->name;

// or:

$name = $session->get('name');

注記

アクセスしようとしている項目が存在しない場合、get() メソッドは null を返します。

既存のすべてのセッションデータを取得したい場合は、項目キーを省略するだけです (マジックゲッターは単一のプロパティ値に対してのみ機能します)。

<?php

$userData = $_SESSION;
// or:
$userData = $session->get();

重要

get() メソッドは、キーによって単一の項目を取得するときに、フラッシュデータまたは一時データ項目を返します。ただし、セッションからすべてのデータを取得するときは、フラッシュデータまたは一時データは返されません。

セッションデータの追加

特定のユーザーがサイトにログインするとします。認証されると、ユーザー名とメールアドレスをセッションに追加して、必要なときにデータベースクエリを実行しなくても、そのデータをグローバルに利用できるようにすることができます.

他の変数と同様に、$_SESSION 配列にデータを代入することができます。または、$session のプロパティとして代入することもできます。

新しいセッションデータを含む配列を set() メソッドに渡すことができます。

<?php

$session->set($array);

$array は新しいデータを含む連想配列です。次に例を示します。

<?php

$newdata = [
    'username'  => 'johndoe',
    'email'     => '[email protected]',
    'logged_in' => true,
];

$session->set($newdata);

セッションデータに一度に1つの値を追加したい場合は、set() は以下の構文もサポートしています。

<?php

$session->set('some_name', 'some_value');

セッション値が存在することを確認したい場合は、isset() を使用して確認します。

<?php

// returns false if the 'some_name' item doesn't exist or is null,
// true otherwise:
if (isset($_SESSION['some_name'])) {
    // ...
}

または、has() を呼び出すこともできます。

<?php

$session->has('some_name');

セッションデータへの新しい値のプッシュ

push() メソッドは、配列であるセッション値に新しい値をプッシュするために使用されます。たとえば、hobbies キーに趣味の配列が含まれている場合、次のように配列に新しい値を追加できます。

<?php

$session->push('hobbies', ['sport' => 'tennis']);

セッションデータの削除

他の変数と同様に、$_SESSION の値の設定解除は unset() を使用して行うことができます。

<?php

unset($_SESSION['some_name']);
// or multiple values:
unset(
    $_SESSION['some_name'],
    $_SESSION['another_name']
);

また、set() を使用してセッションに情報を追加できるのと同様に、remove() を使用してセッションキーを渡すことで情報を削除できます。たとえば、セッションデータ配列から some_name を削除したい場合は、次のようにします。

<?php

$session->remove('some_name');

このメソッドは、設定解除するアイテムキーの配列も受け入れます。

<?php

$array_items = ['username', 'email'];
$session->remove($array_items);

フラッシュデータ

CodeIgniterは「フラッシュデータ」、つまり次のリクエストでのみ利用可能で、その後自動的にクリアされるセッションデータをサポートしています。

これは、特に一度限りの情報、エラー、またはステータスメッセージ(例:「レコード2が削除されました」)に非常に便利です。

フラッシュデータ変数は、CodeIgniterセッションハンドラ内で管理される通常のセッション変数であることに注意してください。

既存のアイテムを「フラッシュデータ」としてマークするには、次のようにします。

<?php

$session->markAsFlashdata('item');

複数のアイテムをフラッシュデータとしてマークする場合は、キーを配列として渡すだけです。

<?php

$session->markAsFlashdata(['item', 'item2']);

フラッシュデータを追加するには、次のようにします。

<?php

$_SESSION['item'] = 'value';
$session->markAsFlashdata('item');

または、setFlashdata() メソッドを使用することもできます。

<?php

$session->setFlashdata('item', 'value');

set() と同様に、setFlashdata() に配列を渡すこともできます。

フラッシュデータ変数の読み取りは、$_SESSION を介した通常のセッションデータの読み取りと同じです。

<?php

$item = $_SESSION['item'];

重要

get() メソッドは、キーで単一のアイテムを取得する際にフラッシュデータアイテムを返します。ただし、セッションからすべてのデータを取得する場合は、フラッシュデータを返しません。

ただし、「フラッシュデータ」(およびその他の種類ではない)を読み取っていることを確認したい場合は、getFlashdata() メソッドを使用することもできます。

<?php

$session->getFlashdata('item');

注記

アイテムが見つからない場合、getFlashdata() メソッドはnullを返します。

または、すべてのフラッシュデータを含む配列を取得するには、キーパラメータを省略します。

<?php

$session->getFlashdata();

フラッシュデータ変数を追加のリクエストを通じて保持する必要がある場合は、keepFlashdata() メソッドを使用して保持できます。単一のアイテムまたはフラッシュデータアイテムの配列を渡して保持できます。

<?php

$session->keepFlashdata('item');
$session->keepFlashdata(['item1', 'item2', 'item3']);

一時データ

CodeIgniterは、「一時データ」、つまり特定の有効期限を持つセッションデータもサポートしています。値の有効期限が切れた後、またはセッションの有効期限が切れたか削除された後、値は自動的に削除されます。

フラッシュデータと同様に、一時データ変数はCodeIgniterセッションハンドラによって内部的に管理されます。

既存のアイテムを「一時データ」としてマークするには、そのキーと有効期限(秒単位!)をmarkAsTempdata()メソッドに渡します。

<?php

// 'item' will be erased after 300 seconds
$session->markAsTempdata('item', 300);

複数のアイテムを一時データとしてマークするには、すべて同じ有効期限にするかどうかに応じて、2つの方法があります。

<?php

// Both 'item' and 'item2' will expire after 300 seconds
$session->markAsTempdata(['item', 'item2'], 300);

// 'item' will be erased after 300 seconds, while 'item2'
// will do so after only 240 seconds
$session->markAsTempdata([
    'item'  => 300,
    'item2' => 240,
]);

一時データを追加するには、次のようにします。

<?php

$_SESSION['item'] = 'value';
$session->markAsTempdata('item', 300); // Expire in 5 minutes

または、setTempdata() メソッドを使用することもできます。

<?php

$session->setTempdata('item', 'value', 300);

setTempdata() に配列を渡すこともできます。

<?php

$tempdata = ['newuser' => true, 'message' => 'Thanks for joining!'];
$session->setTempdata($tempdata, null, $expire);

注記

有効期限が省略されているか0に設定されている場合、デフォルトの有効期間値である300秒(または5分)が使用されます。

一時データ変数を読み取るには、$_SESSIONスーパーグローバル配列を介してアクセスできます。

<?php

$item = $_SESSION['item'];

重要

get()メソッドは、キーによって単一のアイテムを取得するときに一時データアイテムを返します。ただし、セッションからすべてのデータを取得する場合、一時データは返されません。

または、「一時データ」(およびその他のいかなる種類でもない)を読み取っていることを確認したい場合は、getTempdata()メソッドを使用することもできます。

<?php

$session->getTempdata('item');

注記

アイテムが見つからない場合、getTempdata()メソッドはnullを返します。

そしてもちろん、既存の一時データをすべて取得したい場合は、次のようにします。

<?php

$session->getTempdata();

一時データ値が期限切れになる前に削除する必要がある場合は、$_SESSION配列から直接設定解除できます。

<?php

unset($_SESSION['item']);

ただし、これでは、この特定のアイテムを一時データにするマーカーは削除されません(次のHTTPリクエストで無効になります)。そのため、同じリクエストで同じキーを再利用する場合は、removeTempdata()を使用する必要があります。

<?php

$session->removeTempdata('item');

セッションのクローズ

close()

バージョン4.4.0の新機能です。

不要になった後に現在のセッションを手動で閉じるには、close()メソッドを使用します。

<?php

$session->close();

セッションを手動で閉じる必要はありません。PHPはスクリプトが終了した後、自動的にセッションを閉じます。ただし、セッションデータは同時書き込みを防ぐためにロックされているため、一度に1つのリクエストのみがセッションを操作できます。セッションデータへのすべての変更が完了したらすぐにセッションを閉じることで、サイトのパフォーマンスを向上させることができます。

このメソッドは、PHPのsession_write_close()関数とまったく同じように機能します。

セッションの破棄

destroy()

現在のセッションをクリアするには(たとえば、ログアウト時)、ライブラリのdestroy()メソッドを使用するだけです。

<?php

$session->destroy();

このメソッドは、PHPのsession_destroy()関数とまったく同じように機能します。

これは、同じリクエスト中に実行する最後のセッション関連操作である必要があります。すべてのセッションデータ(フラッシュデータと一時データを含む)は永久に破棄されます。

注記

通常のコードからこのメソッドを呼び出す必要はありません。セッションを破棄するのではなく、セッションデータをクリーンアップします。

stop()

バージョン4.3.5以降では非推奨です。

セッションクラスには、stop()メソッドもあります。

警告

v4.3.5より前では、バグによりこのメソッドはセッションを破棄しませんでした。

v4.3.5以降、このメソッドはセッションを破棄するように変更されました。ただし、destroy()メソッドとまったく同じであるため、非推奨です。destroy()メソッドを代わりに使用してください。

セッションメタデータへのアクセス

CodeIgniter 2では、セッションデータ配列にはデフォルトで4つのアイテムが含まれていました: 'session_id'、 'ip_address'、 'user_agent'、 'last_activity'。

これは、セッションの仕組みの特殊性によるものですが、新しい実装では不要になりました。ただし、アプリケーションがこれらの値に依存している場合があるため、アクセスするための代替方法を次に示します。

  • session_id:$session->session_idまたはsession_id()(PHPの組み込み関数)

  • ip_address:$_SERVER['REMOTE_ADDR']

  • user_agent:$_SERVER['HTTP_USER_AGENT'](セッションでは使用されません)

  • last_activity:ストレージによって異なり、簡単な方法はありません。すみません!

セッション設定

CodeIgniterは通常、すべてをすぐに使えるようにします。ただし、セッションはアプリケーションの非常に重要なコンポーネントであるため、慎重な構成を行う必要があります。すべてのオプションとその影響について、時間をかけて検討してください。

注記

v4.3.0以降、新しい**app/Config/Session.php**が追加されました。以前は、セッション設定は**app/Config/App.php**ファイルにありました。

**app/Config/Session.php**ファイルには、次のセッション関連の設定があります。

設定

デフォルト

オプション

説明

driver

CodeIgniter\Session\Handlers\FileHandler

CodeIgniter\Session\Handlers\FileHandler CodeIgniter\Session\Handlers\DatabaseHandler CodeIgniter\Session\Handlers\MemcachedHandler CodeIgniter\Session\Handlers\RedisHandler CodeIgniter\Session\Handlers\ArrayHandler

使用するセッションストレージドライバ。

cookieName

ci_session

[A-Za-z_-]文字のみ

セッションクッキーに使用される名前。

expiration

7200(2時間)

秒単位の時間(整数)

セッションを継続させる秒数。期限切れにならないセッション(ブラウザが閉じられるまで)が必要な場合は、値をゼロに設定します:0

savePath

null

なし

ストレージの場所を指定します。使用されているドライバによって異なります。

matchIP

false

true/false(ブール値)

セッションクッキーを読み取るときにユーザーのIPアドレスを検証するかどうか。一部のISPはIPを動的に変更するため、期限切れにならないセッションが必要な場合は、これをfalseに設定する可能性があります。

timeToUpdate

300

秒単位の時間(整数)

このオプションは、セッションクラスが自身を再生成して新しいセッションIDを作成する頻度を制御します。0に設定すると、セッションIDの再生成が無効になります。

regenerateDestroy

false

true/false(ブール値)

セッションIDを自動再生成する際に、古いセッションIDに関連付けられたセッションデータを破棄するかどうか。falseに設定すると、データは後でガベージコレクタによって削除されます。

注記

最後の手段として、上記のいずれも設定されていない場合、セッションライブラリはPHPのセッション関連のINI設定と、CodeIgniter 3の「sess_expire_on_close」などの設定を取得しようとします。ただし、この動作は予期しない結果を引き起こしたり、将来変更される可能性があるため、決して依存するべきではありません。すべてを適切に設定してください。

注記

expiration0 に設定されている場合、PHPのセッション管理で設定された session.gc_maxlifetime 設定がそのまま使用されます(多くの場合、デフォルト値は 1440 です)。これは必要に応じて php.ini で、または ini_set() を介して変更する必要があります。

上記の値に加えて、セッションCookieは**app/Config/Cookie.php**ファイルの次の設定値を使用します。

設定

デフォルト

説明

ドメイン

‘’

セッションが適用されるドメイン

パス

/

セッションが適用されるパス

セキュア

false

暗暗号化された(HTTPS)接続でのみセッションCookieを作成するかどうか

sameSite

Lax

セッションCookieのSameSite設定

注記

httponly 設定はセッションには影響しません。代わりに、セキュリティ上の理由から、HttpOnlyパラメータは常に有効になっています。さらに、Config\Cookie::$prefix 設定は完全に無視されます。

セッションドライバ

既に述べたように、セッションライブラリには、使用できる4つのハンドラ、つまりストレージエンジンが付属しています。

  • CodeIgniter\Session\Handlers\FileHandler

  • CodeIgniter\Session\Handlers\DatabaseHandler

  • CodeIgniter\Session\Handlers\MemcachedHandler

  • CodeIgniter\Session\Handlers\RedisHandler

  • CodeIgniter\Session\Handlers\ArrayHandler

デフォルトでは、セッションが初期化されるときに FileHandler ドライバが使用されます。これは、最も安全な選択肢であり、あらゆる場所(事実上すべての環境にファイルシステムがあります)で動作することが期待されるためです。

ただし、**app/Config/Session.php**ファイルの public $driver 行で他のドライバを選択することもできます。ただし、すべてのドライバには異なる注意点があるため、選択を行う前に、それら(以下)をよく理解しておく必要があります。

注記

ArrayHandlerはテスト中に使用され、すべてのデータをPHP配列内に格納しますが、データが永続化されるのを防ぎます。

FileHandler ドライバ(デフォルト)

「FileHandler」ドライバは、ファイルシステムを使用してセッションデータを格納します。

PHP独自のデフォルトのセッション実装とまったく同じように動作すると言っても過言ではありませんが、これが重要な詳細である場合は、実際には同じコードではなく、いくつかの制限(と利点)があることに注意してください。

具体的には、PHPのsession.save_pathで使用されるディレクトリレベルおよびモード形式はサポートされておらず、安全のためにほとんどのオプションがハードコードされています。代わりに、public string $savePath には絶対パスのみがサポートされています。

知っておくべきもう1つの重要なことは、セッションファイルを保存するために、公開読み取り可能または共有ディレクトリを使用しないようにすることです。選択した*savePath*ディレクトリのコンテンツを表示できるアクセス権が*自分だけ*にあることを確認してください。そうでない場合、それを行うことができる人は誰でも、現在のセッションを盗むことができます(「セッション固定」攻撃とも呼ばれます)。

UNIXライクなオペレーティングシステムでは、これは通常、*chmod*コマンドを使用してそのディレクトリに0700モードのアクセス許可を設定することによって実現されます。これにより、ディレクトリの所有者のみが読み取りおよび書き込み操作を実行できます。ただし、スクリプトを*実行*しているシステムユーザーは通常、自分自身ではなく、「www-data」のようなものであるため、これらのアクセス許可を設定するだけではアプリケーションが壊れる可能性があることに注意してください。

代わりに、環境に応じて次のような操作を行う必要があります。

mkdir /<path to your application directory>/writable/sessions/
chmod 0700 /<path to your application directory>/writable/sessions/
chown www-data /<path to your application directory>/writable/sessions/

ボーナスのヒント

ファイルストレージは通常速度が遅いため、別のセッションドライバを選択する人もいるでしょう。これは半分しか正しくありません。

非常に基本的なテストでは、SQLデータベースの方が高速であると信じさせられる可能性がありますが、99%のケースでは、これは現在のセッションが少数の間にのみ当てはまります。セッション数とサーバーの負荷が増加するにつれて(つまり、重要なとき)、ファイルシステムはほぼすべてのリレーショナルデータベース設定を一貫して凌駕します。

さらに、パフォーマンスが唯一の懸念事項である場合は、セッションを非常に高速にすることができるtmpfs(警告:外部リソース)の使用を検討することをお勧めします。

DatabaseHandler ドライバ

重要

他のプラットフォームにはアドバイザリロックメカニズムがないため、MySQLとPostgreSQLデータベースのみが公式にサポートされています。ロックなしでセッションを使用すると、特にAJAXを多用する場合に、あらゆる種類の問題が発生する可能性があり、そのようなケースはサポートしません。パフォーマンスの問題が発生している場合は、セッションデータの処理が完了したらclose()メソッドを使用してください。

「DatabaseHandler」ドライバは、MySQLやPostgreSQLなどのリレーショナルデータベースを使用してセッションを格納します。これは、開発者がアプリケーション内のセッションデータに簡単にアクセスできるため、多くのユーザーの間で人気のある選択肢です。これは、データベース内の別のテーブルにすぎません。

ただし、満たさなければならない条件がいくつかあります。

  • 永続的な接続は使用できません。

DatabaseHandlerの設定

テーブル名の設定

「DatabaseHandler」セッションドライバを使用するには、既に述べたこのテーブルを作成し、それを$savePath 値として設定する必要があります。たとえば、「ci_sessions」をテーブル名として使用する場合、次のようにします。

<?php

namespace Config;

use CodeIgniter\Config\BaseConfig;
use CodeIgniter\Session\Handlers\FileHandler;

class Session extends BaseConfig
{
    // ...
    public string $driver = 'CodeIgniter\Session\Handlers\DatabaseHandler';

    // ...
    public string $savePath = 'ci_sessions';

    // ...
}
データベーステーブルの作成

そしてもちろん、データベーステーブルを作成します…

MySQLの場合

CREATE TABLE IF NOT EXISTS `ci_sessions` (
    `id` varchar(128) NOT null,
    `ip_address` varchar(45) NOT null,
    `timestamp` timestamp DEFAULT CURRENT_TIMESTAMP NOT null,
    `data` blob NOT null,
    KEY `ci_sessions_timestamp` (`timestamp`)
);

PostgreSQLの場合

CREATE TABLE "ci_sessions" (
    "id" varchar(128) NOT NULL,
    "ip_address" inet NOT NULL,
    "timestamp" timestamptz DEFAULT CURRENT_TIMESTAMP NOT NULL,
    "data" bytea DEFAULT '' NOT NULL
);

CREATE INDEX "ci_sessions_timestamp" ON "ci_sessions" ("timestamp");

注記

id 値には、セッションCookie名(Config\Session::$cookieName)とセッションID、および区切り文字が含まれています。たとえば、長いセッションIDを使用する場合など、必要に応じて増やす必要があります。

プライマリキーの追加

**$matchIP設定に応じて**、PRIMARY KEYを追加する必要もあります。以下の例は、MySQLとPostgreSQLの両方で機能します。

// When $matchIP = true
ALTER TABLE ci_sessions ADD PRIMARY KEY (id, ip_address);

// When $matchIP = false
ALTER TABLE ci_sessions ADD PRIMARY KEY (id);

// To drop a previously created primary key (use when changing the setting)
ALTER TABLE ci_sessions DROP PRIMARY KEY;

重要

正しいプライマリキーを追加しないと、次のエラーが発生する可能性があります。

Uncaught mysqli_sql_exception: Duplicate entry 'ci_session:***' for key 'ci_sessions.PRIMARY'
データベースグループの変更

デフォルトでは、デフォルトのデータベースグループが使用されます。使用するデータベースグループを変更するには、**app/Config/Session.php**ファイルの$DBGroup プロパティを、使用するグループの名前に変更します。

<?php

namespace Config;

use CodeIgniter\Config\BaseConfig;
use CodeIgniter\Session\Handlers\FileHandler;

class Session extends BaseConfig
{
    // ...
    public ?string $DBGroup = 'groupName';
}
コマンドを使用したデータベーステーブルの設定

これらすべてを手動で行いたくない場合は、CLIからmake:migration --session コマンドを使用して、移行ファイルを作成できます。

php spark make:migration --session
php spark migrate

このコマンドは、コードを生成するときに$savePath$matchIP の設定を考慮します。

RedisHandler ドライバ

注記

Redisにはロックメカニズムが公開されていないため、このドライバのロックは、最大300秒間保持される個別の値によってエミュレートされます。v4.3.2 以降では、**TLS**プロトコルを使用してRedis に接続できます。

Redisは、通常キャッシングに使用されるストレージエンジンであり、その高パフォーマンスのために人気があります。これはおそらく「RedisHandler」セッションドライバを使用する理由でもあります。

欠点は、リレーショナルデータベースほどユビキタスではなく、システムにphpredis PHP拡張機能がインストールされている必要があることです。そして、それはPHPにバンドルされていません。RedisHandlerドライバを使用するのは、既にRedisに精通していて、他の目的で使用している場合のみです。

RedisHandlerの設定

「FileHandler」および「DatabaseHandler」ドライバと同様に、$savePath 設定を使用して、セッションのストレージ場所を設定する必要があります。ここでの形式は少し異なり、同時に複雑です。*phpredis*拡張機能のREADMEファイルで詳しく説明されているため、ここでは単にリンクを掲載します。

ただし、最も一般的なケースでは、単純なhost:port のペアで十分です。

<?php

namespace Config;

use CodeIgniter\Config\BaseConfig;
use CodeIgniter\Session\Handlers\FileHandler;

class Session extends BaseConfig
{
    // ...
    public string $driver = 'CodeIgniter\Session\Handlers\RedisHandler';

    // ...
    public string $savePath = 'tcp://:6379';

    // ...
}

MemcachedHandler ドライバ

注記

Memcachedにはロックメカニズムが公開されていないため、このドライバのロックは、最大300秒間保持される個別の値によってエミュレートされます。

「MemcachedHandler」ドライバは、PHP の Memcached 拡張機能が PECL 経由で配布され、一部の Linux ディストリビューションでは簡単にインストールできるパッケージとして提供されているため、可用性を除けば、そのすべてのプロパティにおいて「RedisHandler」と非常によく似ています。

それ以外では、Redis に対する意図的な偏見なしに、Memcached について言うべきことはそれほど多くありません。Memcached もキャッシングに使用される一般的な製品であり、その速度で有名です。

ただし、Memcached によって提供される唯一の保証は、値 X を Y 秒後に期限切れに設定すると、Y 秒が経過した後に削除されることです(ただし、必ずしもその時間より前に期限切れにならないとは限りません)。これは非常にまれに発生しますが、セッションの損失につながる可能性があるため、考慮する必要があります。

MemcachedHandler の設定

$savePath の形式は、host:port のペアであるため、非常に単純です。

<?php

namespace Config;

use CodeIgniter\Config\BaseConfig;
use CodeIgniter\Session\Handlers\FileHandler;

class Session extends BaseConfig
{
    // ...
    public string $driver = 'CodeIgniter\Session\Handlers\MemcachedHandler';

    // ...
    public string $savePath = 'localhost:11211';

    // ...
}

ヒント

3 番目のコロン区切り(:weight)の値としてオプションの *weight* パラメータを持つマルチサーバー構成もサポートされていますが、それが信頼できるかどうかはテストしていません。

この機能を試してみたい場合(自己責任で)、複数のサーバーパスをカンマで区切るだけです。

<?php

namespace Config;

use CodeIgniter\Config\BaseConfig;
use CodeIgniter\Session\Handlers\FileHandler;

class Session extends BaseConfig
{
    // ...

    // localhost will be given higher priority (5) here,
    // compared to 192.0.2.1 with a weight of 1.
    public string $savePath = 'localhost:11211:5,192.0.2.1:11211:1';

    // ...
}