ホームページ >バックエンド開発 >PHPチュートリアル >PHPセッションの有効期間に関する問題

PHPセッションの有効期間に関する問題

WBOY
WBOYオリジナル
2016-06-13 12:35:25830ブラウズ

PHP セッションの有効性の問題

? ?セッションの動作メカニズムは、各訪問者に対して一意の ID (UID) を作成し、この UID に基づいて変数を保存することです。 UID は Cookie に保存されるか、URL を通じて渡されます。

PHP のデフォルトのセッション有効期間は 1440 秒 (24 分) です [weiweiok 注: PHP5 のデフォルトは 180 分]。つまり、クライアントが 24 分を超えて更新されない場合、現在のセッションは有効期限が切れます。明らかに、これでは十分ではありません。
?
?
既知の効果的な方法は、session_set_save_handler を使用してすべてのセッション管理作業を引き継ぐことです。一般に、セッション情報はデータベースに保存されるため、SQL ステートメントを通じて期限切れのセッションをすべて削除でき、セッションの有効期間を延長できます。正確に制御されています。これは、PHP ベースの大規模な Web サイトで一般的に使用される方法でもあります。ただし、通常の小規模な Web サイトの場合は、それほど苦労する必要はないようです。
しかし、一般的なセッションには有効期限があり、ユーザーがブラウザを閉じると、セッション変数は保存できません。では、Session の永続的な寿命を達成するにはどうすればよいでしょうか? ?
ご存知のとおり、セッションはサーバー側に保存され、クライアントから提供されたセッション ID に基づいてユーザーのファイルが取得され、そのファイルが読み取られて変数の値が取得されます。クライアントのCookieまたはHttp1.1プロトコルのQuery_String(アクセスしたURLの「?」以降の部分)をサーバーに送信し、サーバーはセッションのディレクトリを読み込みます...?
セッションの永続的な存続を実現するには、まず php.ini のセッションの関連設定を理解する必要があります (php.ini ファイルの「[セッション]」セクションを開きます):?
1. .use_cookies: デフォルト値は「1」です。これは、SessionID が Cookie によって渡されることを意味します。それ以外の場合は、Query_String;?
2 によって渡されます。 session.name: これは、SessionID に格納される変数名です。 Cookie または Query_String。デフォルト値は「PHPSESSID」です。?
3。Session.cookie_lifetime: Cookie のデフォルトの保存時間は 0 です。これは、SessionID がすぐに無効になることを意味します。ブラウザが閉じると... このため、セッションは永続的に使用できなくなります。 ?
4. session.gc_maxlifetime: セッション データがサーバー側に保存される時間です。この時間を超えると、セッション データは自動的に削除されます。 ?
他にも多くの設定がありますが、これらはこの記事に関連するものであり、永続セッションを使用するための原則と手順から始めましょう。 ?
前述したように、サーバーはSessionIDを通じてSessionデータを読み取りますが、一般的にブラウザが送信したSessionIDはブラウザを閉じると消えてしまうので、手動でSessionIDを設定して保存するだけですよね。 .. ...?
サーバーの操作権限がある場合、これを設定するのは非常に簡単です。次の手順を実行するだけです。?
1. 「session.use_cookies」を次のように設定します。ただし、デフォルトは 1 であり、通常は変更する必要はありません。?
2. 「session.cookie_lifetime」を正の無限大に変更します (もちろん、正の無限大のパラメータはありません)。ただし、999999999 と正の無限大には違いはありません);?
3. 「session.gc_maxlifetime」は「session.cookie_lifetime」と同じ時間に設定されます;?
PHP ドキュメントには次のように明記されています。セッションの有効期間を設定するパラメータは session.gc_maxlifetime です。このパラメータは、php.ini ファイルまたは ini_set() 関数を通じて変更できます。問題は、多くのテストを行った後、このパラメーターを変更しても基本的には効果がなく、セッションの有効期間がデフォルト値の 24 分のままであることです。 ?
PHP の動作メカニズムにより、セッション情報を定期的にスキャンしてセッション情報が無効かどうかを判断するデーモン スレッドがありません。有効なリクエストが発生すると、PHP はグローバル変数 session.gc_probability/session.gc_divisor (php.ini または ini_set() 関数を通じて変更することもできます) の値に基づいて GC (ガベージ コレクター) を開始するかどうかを決定します。 。デフォルトでは、session.gc_probability = 1、session.gc_divisor = 100 です。これは、GC が開始される確率が 1% であることを意味します。 ?
GC の仕事は、すべてのセッション情報をスキャンし、現在の時刻からセッションの最終変更時刻 (変更日) を減算し、存続時間が gc_maxlifetime を超えている場合は session.gc_maxlifetime パラメーターと比較することです。セッションを削除します。 ?
これまでのところ、すべてがうまく機能しています。では、なぜ gc_maxlifetime が無効になるのでしょうか? ?
デフォルトでは、セッション情報はシステムの一時ファイル ディレクトリにテキスト ファイルの形式で保存されます。 Linux では、このパスは通常 tmp であり、Windows では通常 C:WindowsTemp です。サーバー上に複数の PHP アプリケーションがある場合、それらのセッション ファイルは同じディレクトリに保存されます。同様に、これらの PHP アプリケーションも一定の確率で GC を開始し、すべてのセッション ファイルをスキャンします。 ?
問題は、GC が動作しているときに、異なるサイト上のセッションが区別されないことです。たとえば、サイト A の gc_maxlifetime は 2 時間に設定され、サイト B の gc_maxlifetime はデフォルトの 24 分に設定されます。サイト B の GC が開始されると、パブリック一時ファイル ディレクトリがスキャンされ、サイト A からのものか B からのものかに関係なく、24 分より古いすべてのセッション ファイルが削除されます。このように、サイト A の gc_maxlifetime 設定は役に立ちません。 ?
問題を見つけたら、解決するのは簡単です。 session.save_path パラメータを変更するか、session_save_path() 関数を使用して、セッションが保存されるディレクトリを専用のディレクトリに指定します。 gc_maxlifetime パラメータは正常に機能します。 ?
厳密に言えば、これは PHP のバグですか? ?
もう 1 つの問題は、gc_maxlifetime が保証できるのはセッションの存続時間の最短時間だけであり、この時間を過ぎるとセッション情報はすぐに削除されることです。 GC は確率に基づいて開始され、長期間開始されない可能性があるため、gc_maxlifetime を超えた後も多数のセッションが有効になります。この問題を解決する 1 つの方法は、session.gc_probability/session.gc_divisor の確率を 100% まで高めることです。ただし、この問題は明らかにパフォーマンスに重大な影響を及ぼします。もう 1 つの方法は、コード内で現在のセッションの存続期間を確認し、それが gc_maxlifetime を超えた場合は、現在のセッションをクリアすることです。 ?
ただし、サーバーを操作する権限がない場合は、永続的なセッション データの保存を実現するために、PHP プログラムを通じて SessionID を書き換える必要があります。 php.net の関数マニュアルを確認すると、「session_id」関数が表示されます。パラメータが設定されていない場合は、現在のセッション ID が返されます。パラメータが設定されている場合は、現在のセッション ID が指定された値に設定されます。 ?
永続的な Cookie を使用し、「session_id」関数を追加する限り、永続的なセッション データを保存できます。 ?
ただし、便宜上、サーバーによって設定された「session.name」を知る必要があります。ただし、ほとんどのユーザーはサーバーの php.ini 設定を表示する権限を持っていません。ただし、PHP は非常に優れた機能を提供します。 「phpinfo」を使用すると、ほぼすべての PHP 情報が表示されます。 ?
---------------------------------------------- -- --?
PHP 関連情報表示?
?
------------- - ----------------------------------?
エディタを開いて上記のコードを入力し、このプログラムをサーバーで実行すると、PHP 関連の情報が表示されます (図 1 を参照)。 「session.name」パラメータがあります。これは必要なサーバーの「session.name」で、通常は「PHPSESSID」です。 ?
SessionID の名前を書き留めると、永続的なセッション データ ストレージを実現できます。 ?
次のようにコードをコピーします:

session_start();?
ini_set('session.save_path','/tmp/');?
//6 時間?
ini_set('session.gc_maxlifetime',21600);
//1 日保存しますか?
$lifeTime = 24 * 3600;?
setcookie(session_name(), session_id(), time() $lifeTime, "/");?
追記:?
実際のところ、Cookie の保存期間は限られており、サーバーのスペースも限られているため、真の永久保存は不可能です...しかし、一部のサイトでは、長期間保存する必要があります。長い間、上記の方法で十分です。 ?
セッションをデータベースに入れることもできますが、トラフィックが多い場合、多数のデータベース操作が Web サイトのパフォーマンスに影響を与えます。


? 出典: http://www.jb51.net/article/17882.htm

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。