3

私はかなり大きな PHP アプリ (数千の一意の URL、さまざまな役割を持つユーザー ログインなど) を持っています。PHP では、php.ini でセッション タイムアウトが 1 時間 (3600 秒) に設定されています。ログインのしくみは次のとおりです。ユーザーがアプリに正常にログインすると、ユーザー名、本名、ロール ID など、ユーザーに関するいくつかの情報が $_SESSION に保存されます。すべてのページ アクセス (共通コード) で、$これらの変数について _SESSION がチェックされ、それらが存在する場合、ユーザーは要求された場所に移動します。変数が存在しない場合、ユーザーは「ログインしていない」ページにリダイレクトされます。

これは過去数年間正常に機能しており、現在も正常に機能しています-ほとんど. 非常にランダムに、セッションが警告などなしにタイムアウトしたように見えます。ログインしているユーザーの場合、これは次のように表示されます。ログインして何かを行い、次のページに移動し、代わりにログアウトして「ログインしていない」ページに戻ります。当然、これは非常に迷惑です。ただし、この動作のランダムな性質により、調査が非常に困難になります。

どのブラウザーでも、自分のマシンでそれを経験したことはありません。オフィスには別のマシンがあり、すべてのブラウザーで常にこれが発生します (少なくとも、問題を再現できます)。さらに別のマシンでは、あるブラウザーで発生し、別のブラウザーでは発生しません。それでも、別のマシンでは、時々発生し、他の時間には発生しません。今日、この問題が発生したクライアントの 1 人から電話がありましたが、別のブラウザーで試すように要求されたところ、問題なく動作しました。

これはブラウザのバージョンによるものではありません。同じバージョンのマシンでは動作し、他のマシンでは動作しないためです。さらに、同じように設定された 2 台のマシンがあると、1 台では発生することがありますが、別のマシンではまったく発生しません。全体として、セッションで非常に奇妙なことが起こっているように見えますが、どこを見ればいいのか完全に困惑しています。私は過去数か月間、これを調査しようとしてきましたが、どこにも行きませんでした. 他にどこを見る?

この時点で、どんな助けも大歓迎です。

追加:ここに私の php.ini のセッション部分があります:

[Session]
session.save_handler = files
session.use_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain =
session.cookie_httponly = 
session.serialize_handler = php
session.gc_divisor     = 100
session.gc_maxlifetime = 3600 
session.bug_compat_42 = 1
session.bug_compat_warn = 1
session.referer_check =
session.entropy_length = 0
session.entropy_file =
session.cache_limiter = nocache
session.cache_expire = 180
session.use_trans_sid = 0
session.hash_function = 0
session.hash_bits_per_character = 4
4

1 に答える 1

0

一部のボックスではセッションがランダムにタイムアウトし、他のボックスでは一貫してタイムアウトし、大部分ではセッションがまったくタイムアウトしないという同じ問題が発生しました。試行錯誤を重ねた結果、IE にコンパクトなプライバシー ポリシーの問題があるいくつかのマシンに問題を突き止めました。so header('P3P: CP=Visit www.oururl.tld for our Privacy Policy.') のようなヘッダーを追加するだけで、古い IE の多くの問題が解決しました。これはサードパーティの Cookie にのみ適用されるはずですが、IE については誰にもわかりません。

次に、.domain.tld にセッション cookie を設定し、www.domain.tld ではなく domain.tld からアクセスするときに、一部のマシンがうまくいかないことがわかりました。すべてのリクエストが www サブドメインに向けられていることを確認することで、他のブラウザのほとんどが解決されました。

最後に、サーバーのタイムゾーンが自動的に設定されたときに問題が発生していたため、php からセッションタイムアウトの設定を引き継ぐ必要がありました。ユーザーがブラウザを閉じるなどして「セッション」が終了するまで、ブラウザを使用してCookieがタイムアウトしないように、有効期限を0に設定するだけです。次に、単に有効期限変数をセッションに追加し、手動でチェックして、有効期限に関するすべてのチェックと決定がクライアントではなくサーバーのタイムゾーンで行われるようにしました。

これらの 3 つのことで、Google や Yahoo Toolbar などがブラウザのキャッシュまたはブラウザの一時インターネット ファイル自体で奇妙なことをしていることが原因であると私が強く疑う最も再現性のないインスタンスを除いて、すべて解決しました。

また、セッション ID の再生成や AJAX/その他の非同期呼び出しを使用している場合は、競合状態が発生していないことを確認することもできます。多くの場合、古いブラウザーでは、ID を再生成するときに Cookie が十分に速く更新されず、新しいブラウザーでさえ、新しい要求で古い ID を送信するのに十分なだけタイミングがずれて、セッションがドロップする可能性があります。これに対する私の最善の解決策は、AJAX でセッション ID を再生成するのではなく、実際のページの読み込み時にのみ再生成して、同期を維持することでした。古いセッション データを自動的に削除する代わりに保持するなど、他にもいくつかの方法があります (これも、アプリケーションのニーズによってのみ判断できる程度には安全ではありません)。

于 2012-10-31T17:32:19.163 に答える