Memcached ドライバーのみを使用してセッション ID を再生成すると CodeIgniter 3 セッションが失われる
P粉356361722
2023-08-31 17:14:45
<p>私は CodeIgniter 3 フレームワークを使用して長期にわたるプロジェクトを開発しています。数か月間、セッションがランダムに失われるという問題が発生していました。フレームワークファイルを最新バージョン(3.1.13)に更新しました。これにより開発サーバーでは問題が解決されたように見えますが、運用環境ではまだ問題が存在します。しかし、現在では、これは応答が新しいセッション Cookie を送信する場合にのみ発生し、セッション ID が再生成されるときに発生することに気付きました。 <code>$config['sess_time_to_update']</code> を変更すると、所要時間が正しく反映されます。 </p>
<p>開発サーバーと運用サーバーの違いはセッション ドライバーです。セッション ドライバーは開発サーバー上のファイルですが、運用サーバーでは memcached を使用します。そこで実験を行ってドライバーをファイルに切り替えたところ、セッションが失われることはなくなりました。 Redis ドライバーを使用してセットアップも試しましたが、問題は発生しませんでした。したがって、Memcached ドライバーに問題があるはずです。でも、別のものと交換するつもりはありません。ログにはエラーはありません。また、php.ini ファイルと memcached 変数が両方ともデフォルト値であることも確認しました。 </p>
<p>CodeIgniter v3.1.13、PHP 7.4.3、Memcached 用 Amazon ElastiCache</p>
<p>これは構成です: </p>
<pre class="brush:php;toolbar:false;">$config['sess_driver'] = 'memcached';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 14400;
$config['sess_save_path'] = 'host.com:11211';
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;</pre>
<p>どこを調べればよいか、何を確認すればよいかなどのアイデアがあれば、大歓迎です。 </p>
この回答を表示。どうやら、セッションの最大有効期限を memcached の有効期限制限より大きく設定した場合に、この問題が発生する可能性があります。その投稿では、OP は次の構成変数を修正することで問題を解決しました。これを試すことができます: リーリー
もう 1 つのオプションは、memcached
を削除し、セッション ストアの代わりにメモリ常駐の
sqlite3データベースを使用することです。本番環境でのパフォーマンスはこれらの間でそれほど変わらないと思います。二つの状況。
AWS ElastiCache Memcached クラスターを使用している場合は、構成
$config['sess_save_path']
で使用したエンドポイントを確認してください。 1 つのオプションは、構成エンドポイント (.cfg.
を含む) または個別のノード エンドポイント (.0001.
、.0002.
を含む) を使用することです。 。構成エンドポイントを使用する場合は、自動検出が有効になっていることを確認してください (サーバーに追加のインストールが必要です - ElastiCache Cluster Client for PHP)。有効になっていない場合、ノードは正しく解決されず、このような問題が発生します。これが私の場合に当てはまることがわかりました。セッション start、regenerate、destroy でメッセージをログに記録しようとしましたが、ファイル ドライバーでは再生成が行われますが、memcached では関数を呼び出すことさえありません。
session_start()
。いくつかの調査の後、ホストを再確認することにし、AWS で このガイドを見つけました。問題が始まったとき、2 番目のノードが Memcached クラスターに追加されましたが、この Autodiscover を設定せずに構成エンドポイントを使用していたことがわかりました。セットアップがどのように機能するかまったくわかりません。そこで、$config['sess_save_path']
をいずれかのノードのエンドポイントに変更したところ、問題は解決しました。このソリューションは、必要なモジュールをインストールしてセットアップするまで、ノードが変更されない限り機能するはずです。