ホームページ  >  記事  >  バックエンド開発  >  PHP で SESSION が期限切れにならないようにする方法の原則と解決策の紹介_PHP チュートリアル

PHP で SESSION が期限切れにならないようにする方法の原則と解決策の紹介_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-21 14:59:50806ブラウズ

PHP で SESSION を維持する方法と、それによって生じるいくつかの考え 最近のプロジェクトには、多くのユーザーがそれを完了するのに多大な労力を費やした後、かなりの時間がかかったことがわかりました。送信時に SESSION の有効期限が切れたため、SESSION を設定し、SESSION をオンラインに維持する方法を検討する必要がありました。

セッションとは何ですか?
WIKIの説明によると、SESSIONとは2つの通信機器間に存在する対話型の情報であり、ある時刻に確立され、一定期間後に消滅するそうです。一般的なセッションには、TCP セッション、WEB セッション (HTTP セッション)、ログイン セッションなどが含まれます。

OSI モデルにおけるセッション実装のさまざまな場所に応じて、セッションは主にいくつかのタイプに分けられます。1 つは、WEB セッション (HTTP セッション) と Telnet リモート ログイン セッションを含む、セッション層の実装です。トランスポート層で実装されるプロトコル (SIP) とインターネット電話通話は TCP SESSION です。

この記事では、主に クライアント側 SESSION とサーバー側 SESSION の 2 つのタイプについて説明します。後者は Java Beans によって最も一般的に提供されます。

セッションって何をするの?
コンピュータ分野、特にネットワークにおいては、SESSIONが特に広く使われており、対話(Dialogue)、セッションなどとも呼ばれ、一般に2つの通信機器間で保存される状態を指すこともあります。ユーザー間およびコンピュータ間 (ログイン SESSION)。

ステートレス通信とは異なり、SESSIONは通常、通信状態を保存するために使用されるため、通信を行う2者のうち少なくとも一方がSESSIONの履歴を保存する必要があります。

セッション(WEBセッション) どのように実施されるのですか?
ブラウザとサーバー間でHTTP通信が行われる場合、通常、ステータスを識別するためにHTTP Cookieが含まれ、通常、ユーザーのいくつかの検証情報とレベルが記録されます。

いくつかのプログラミング言語で最も一般的に使用される HTTP セッション トークンは、JSESSIONID (JSP)、PHPSESSID (PHP)、ASPSESSIONID (ASP) です。この識別子は通常、ハッシュ関数によって生成され、ユーザーの ID を一意に表すことができます。サーバー上でクライアントと通信する際、GET または POST パラメーターとしてクライアントに保存されます。

SESSION を実装するには通常、サーバー側 SESSION とクライアント側 SESSION の 2 つの方法があります。どちらの方法にも独自の長所と短所があります。

サーバー側の SESSION は実装が簡単で比較的効率的ですが、負荷分散や高可用性の要件が発生した場合の処理​​がより困難になります。また、内生システムにストレージ デバイスがない場合にも使用できません。負荷分散は、ファイル システムを共有するか、顧客に 1 つのサーバーのみに強制的にログインさせることで実現できますが、これでは効率が低下します。ストレージのないデバイスの場合、サーバー側の SESSION 実装は RAM を使用して解決することもできます (参考資料 6 を参照)。この方法は、クライアント接続が制限されているシステム (ルーティングまたはアクセス ポイント デバイスなど) に効果的です。

クライアント側の SESSION を使用すると、負荷分散アルゴリズムの回避など、サーバー側の SESSION のいくつかの問題を解決できますが、それ自体がいくつかの問題を引き起こすこともあります。クライアント SESSION は、Cookie と暗号化テクノロジーを使用して、異なるリクエスト間の状態を保存します。各動的ページが終了すると、現在のセッションがカウントされ、クライアントに送り返されます。リクエストが成功するたびに、Cookie がサーバーに送信され、サーバーがユーザーの ID を「記憶」できるようになります。クライアント SESSION の最も重要な問題はセキュリティです。Cookie がハイジャックまたは改ざんされると、ユーザーの情報のセキュリティが失われます。

PHPでSESSIONを設定するにはどうすればよいですか?
PHP 開発環境をセットアップした後、phpinfo() を通じて以下を含む SESSION 関連部分を表示できます:
SESSION モジュール、PHP V5.2.9 バージョンでは、合計 25 個の変数があります。その中で、日常的な設定でよく使用されるものは次のとおりです。

コードをコピー コードは次のとおりです:
session.cookie_lifetime SESSIONID を保存するための Cookie の有効期限を設定します
session.name SESSION の COOKIE 名、デフォルトは PHPSESSID
session.save_handler SESSION のストレージメソッド、デフォルトは FILE
session.save_path Fedora でのデフォルトのストレージは /var/lib/php/session
session.gc_probability
session.gc_divisor
session.gc_maxlifetime これらGC メカニズムを処理するために 3 つのオプションが使用されます。
session.cache_limiter の確率 (nocache、private、private_no_expire、public)
session.cache_expire これらの 2 つのオプションは、SESSION ページをキャッシュするために使用されます


まず最初の質問について考えてみましょう。SESSION の有効期限はどのくらいかかりますか? PHP プログラムで SESSION を使用する場合は、まず session_start() を参照する必要があります。この関数が実行されると、SESSION ファイルが SESSION の格納ディレクトリに生成されます (ファイル ハンドラーが使用されている場合)。同時に参照すると、サーバーはハッシュされた SESSION 名を保存する PHPSESSID という名前の Cookie を確認します。

SESSION の有効期限は、ガベージ コレクション メカニズム (ガベージ コレクション) に依存します。SESSION が作成されると、クライアント スクリプトが SESSION 内の変数にアクセスするたびに、SESSION ファイルのアクセス時間が変化します。更新します。各訪問は、クライアントに保存されている SESSIONID に基づいて、サーバーに保存されている一意の SESSION を要求します。クライアントの Cookie の有効期限が切れると、サーバー上の SESSION ファイルがまだアクセスされていないにもかかわらず、どの SESSION がアクセスされているかを知ることはできません。有効期限が切れると、サーバー リソースが無駄に消費されます。

同時に、ユーザーのセッションをすぐに期限切れにしたい場合は、Cookie を設定することでこれを実現できます。 SESSION リサイクルは、ページがアクセスされるたびに実行されます。リサイクルの確率は session.gc_probability、session_gc_divisor で指定され、デフォルトは ±1/100 です。 1 に設定すると、SESSION がその有効期間を超えてアクセスされるたびに、SESSION がリサイクルされます。

2 つの要件:
1. SESSION を期限切れにしない、または SESSION の有効期限を延長する
2. SESSION をすぐに期限切れにする。

1. 特に内部アプリケーション システムや大規模なフォームがある場合、SESSION が期限切れにならないようにし、SESSION の有効期限を延長することが非常に必要です。上司がフォームに記入したときのことを考えてください。ちょうど昼食の時間でした。彼は昼食から戻ってくるまでフォームを保管し、残りの内容を記入しました。送信後に表示されたのは、通常、ログイン インターフェイスでした。ユーザーエクスペリエンスを向上させたい場合は、上司のフォームが問題を引き起こすのを防ぐことが重要です。SESSION のライフサイクルを延長する必要があります。

SESSION の有効期限が切れないようにし、SESSION の有効期限を延長するには、session.gc_maxlifetime を設定することで実現できますが、まず、gc がリサイクルを実行する前にクライアントの Cookie が期限切れにならないようにする必要があります。 gc_maxlifetime を長く設定すると、セッションの有効期間を延長できますが、すべてのリクエストが長期間保持されるわけではないアプリケーションの場合、これは明らかにサーバー構成にとって最良の選択ではありません。
SESSIONのリサイクルメカニズムは、SESSIONファイルの最終アクセス時刻に基づいて判断され、maxlifetimeを超えた場合、リサイクル確率に従ってリサイクルされることがわかっています。したがって、SESSION に定期的にアクセスするだけで済みます。これは、ページを更新することで実現できます。これには解決策があります。

JS を通じて定期的にページにアクセスします。
Iframe を使用してページを定期的に更新します。
プログラムを直接使用して HTTP リクエストを送信するため、ページに他の要素を埋め込む必要がなくなります。

以下は、ページ(大きなフォームページなど)でSESSIONを長時間保持するだけで済むように、JSを使用してSESSIONが期限切れにならないようにリクエストを送信する実装方法です。


コードをコピー コードは次のとおりです: