web-dev-qa-db-ja.com

Memcache + PHPセッションのチューニング:memcacheはキーを期限切れにする方法を教えてください。

私はこれについていくつかの調査を行いましたが、決定的な答えは見つかりませんでした。

PHP + Memcacheセッションハンドラーを使用するWebアプリがあります。

私はいくつかの質問がありますが、すべて相互に関連していますが、最終的に私の問題は、「なぜPHPセッションが必要であると思われるときに、セッションが有効期限切れにならないのですか? "」です。つまり、エンドユーザーはアプリからログアウトする必要があります一定時間後ですが、そうではありません。

ここに点があります、それらを接続するのを手伝ってください、そして私が間違っているところを教えてください:

  • Memcacheは、設定された時間(秒単位)(または大きな値の場合はUNIXタイムスタンプ)に基づいてMemcacheがキーを期限切れにすることを理解しています。
  • 有効期限は遅延します-つまり、事前に削除されるものはありません
  • PHP memecacheセッションハンドラーは、sessions.gc_max_lifetimeを使用してmemcacheキーの有効期限を設定します。idk、そうでない場合がありますか?
  • Memcacheは、リクエストされたキーを提供し、それが期限切れであることを確認したら、提供しないでください(その後、削除することもできますか?)。しかし、少なくともそれを提供していません。
  • このサービスを提供しないという行為は、PHPにとって、削除されたセッションとユーザーがログアウトしていることと同じです。

ユーザーはログアウトされていません。

どうすればこれをデバッグできますか? Memcacheは完全に透過的ではありません。

機能していない例は、セッションタイムアウトが2時間に設定されているサイトです。サンプルユーザーは、最後にサイトを最後に使用し、その後8〜10時間後にサイトに戻ってログオンします。

7
JDS

私達もこれに遭遇しましたが、何とかそれを掘り下げて、何が起こっているのか正確に解明することができました。私たちが遭遇した症状は、memcache(複数のサーバー間で実行されるかなり大きなメモリ割り当てを伴う)がコンテンツを排除し始めたことです。これは、サイトの現在の訪問者に悪影響を与える可能性があるため、望ましくありません。

ネットワークトラフィックを監視すると、PHPからMemcacheへのメッセージが次のように表示されます。

set memc.sess.key.abcdabcdabcdabcdabcdabcd 0 0 1823データ...

問題の原因は2番目のゼロです。これは、memcacheがアイテムをキャッシュする時間の長さを決定します。ゼロに設定すると、memcacheはこのアイテムを期限切れにしません。あなたの場合、これはユーザーが数時間後に戻ってあなたのサイトにアクセスし続けることを意味しました。私たちのケースでは、memcacheがいっぱいになり、必要なデータが削除されていました。

さらに掘り下げると、PHP memcached拡張機能になります。1.0.2(実行中)の時点で、このコードは次のようになっています。

_sess_lifetime = zend_ini_long(ZEND_STRL("session.gc_maxlifetime"), 0);
if (sess_lifetime > 0) {
    expiration = time(NULL) + sess_lifetime;
} else {
    expiration = 0;
}
_

この抜粋では、期待値を返さないのはZEND_STRL("session.gc_maxlifetime")です。これはPHPのバグとして報告されており、memcachedライブラリの修正については https://bugs.php.net/bug.php?id=59641 で説明されています。

私はこのパッチを展開し、ネットワークトラフィックを確認したところ、期待どおりに有効期限が設定されていることがわかりました。

10
rtshilston