ホームページ バックエンド開発 PHPチュートリアル PHP でのセッションのライフサイクル

PHP でのセッションのライフサイクル

Jun 23, 2016 pm 01:25 PM

まず、セッション作成の開始から終了までのプロセスについて説明します。

プログラムがクライアントのリクエストに対してセッションを作成する必要がある場合、サーバーはまずクライアントにセッション ID と呼ばれるセッション識別子が既に含まれているかどうかを確認します (セッションが既に含まれている場合、取得メソッドは session_id() です)。 id は、クライアントが以前にセッションを作成したことがあり、サーバーがセッション ID に従ってセッション内の値を取得することを意味します。クライアントにセッション ID が含まれていない場合は、クライアントが初めてサーバーを要求したことを意味します。キャッシュ ファイルを手動でクリアした場合、このクライアントのセッションを作成し、このセッションに関連付けられたセッション ID を生成します。一般的に、セッション ID の値は繰り返されず、暗号化された文字列であるこのセッション ID が使用されます。応答は保管のためにクライアントに返されます。

セッションはいつ作成されますか?

通常(通常という意味)ブラウザがサーバーに最初のリクエストを行うときに作成され、ある程度のメモリスペースを占有するため、不要な場合はセッションを閉じるようにしてください。

セッションはいつ削除されますか?

通常、セッションは次の状況で削除されます:

まず、session_destroy() リセット関数を使用して手動で削除します。

次に、セッションの最後のアクティビティ時刻と現在の時刻の間の間隔が時間を超えます。セッション タイムアウト設定 3 つ目は、サーバー プロセスを停止することです。

ブラウザを閉じたときにセッションを削除するにはどうすればよいですか?

理論的には、これは不可能です。http はステートレス プロトコルであるため、サーバーはクライアントがいつブラウザを閉じたかを知りません。また、PHP にはこの情報を取得するための関連機能がありません。しかし、この問題はまだ解決できます。つまり、Web ページの特殊効果コード window.oncolose を使用してブラウザの終了アクションを監視し、Ajax を使用してサーバーにセッションを削除するリクエストを送信します。ただし、この方法では問題が完全に解決されません。ブラウザのクラッシュ、突然の停電、ユーザーのフリーズなど、場合によっては対応できない場合がございます。

一定期間後にセッションが自動的に期限切れになる (削除される) ように設定するにはどうすればよいですか?

session_start() はセッションメカニズムの始まりであり、一定の確率でガベージコレクションを有効にします。セッションはファイルに保存されるため、SESSION のリサイクル (削除) は無効になります。この確率は php.ini の設定に基づいて決定されますが、一部のシステムでは session.gc_probability = 0 が設定されており、これは確率が 0 であることを意味し、ガベージ コレクション (つまり、セッションの削除) は cron スクリプトを通じて実装されます。 。

PHP のデフォルトのセッション有効期間は 1440 秒 (24 分、注意: php5 のデフォルトは 180 分)、つまり、クライアントが 24 分を超えて更新しない場合、現在のセッションは期限切れになります。明らかに、これは実行できません。

既知の効果的な方法は、session_set_save_handler を使用してすべてのセッション管理作業を引き継ぐことです。これにより、期限切れのセッションはすべて SQL ステートメントを通じて削除できます。これは、PHP をベースにした大規模な Web サイトでは一般的な方法ですが、一般的なセッションにはその必要はないようです。有効期間は限られており、ユーザーがブラウザを閉じるとセッション変数は保存されません。それでは、どうすればセッションの永続的な有効期間を実現できるのでしょうか? ご存知のとおり、セッションはサーバー側に保存され、ユーザーのファイルは保存されます。クライアントから提供されたSessionIDに基づいてファイルが読み取られ、変数SessionIDの値が取得されます。クライアントのCookieまたはHttp1.1プロトコルのQuery_String(アクセスされた文字列の「?」以降の部分)を使用できます。 URL) を使用してサーバーに送信すると、サーバーはセッション ディレクトリを読み取ります

セッションの永続的な存続期間を理解するには、まずセッションに関する php.ini の関連設定を見てみましょう ( php.ini ファイルの「[Session]」セクションを開きます):

1. session.use_cookies: デフォルト値は「1」で、SessionID が Cookie によって渡され、その逆も同様です。 ;

2. session.name: これは、SessionID に保存される変数名です。デフォルト値は、「PHPSESSID」です。

3. これは、デフォルトの保存時間を表します。クライアント Cookie の値は 0 です。これは、ブラウザを閉じるとすぐにセッション ID が無効になることを意味します。このため、セッションは永続的に使用できなくなります。

4. これが時間です。この時間を超えると、セッション データは自動的に削除されます。

この記事に関連する設定は次のとおりです。永続的なセッションの使用方法

前に述べたように、サーバーはセッション データを読み取るためにセッション ID を渡しますが、通常、ブラウザから送信されたセッション ID はブラウザを閉じると失われるため、手動でセッション ID を設定して保存するだけで済みます。それ、それです。サーバーの操作権限を持っている場合、次の手順に従うだけで、セットアップは非常に簡単です。

1. "session.use_cookies" を 1 に設定し、セッション ID を保存するための Cookie をオンにします。ただし、デフォルトは 1 です。通常は変更する必要はありません。

2. "session.cookie_lifetime" を正の無限大に変更します。正の無限大パラメータですが、999999999 と正の無限大の間に違いはありません);

3. 「session.gc_maxlifetime」を「session.cookie_lifetime」と同じ時間に設定します

このパラメータは、PHP ドキュメントに明記されています。セッションの有効期間を設定するのは 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 の役割は、すべてのセッション情報をスキャンし、現在の時刻からセッションの最終変更時刻 (変更日) を減算し、それを session.gc_maxlifetime パラメータと比較することです。生存時間が 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」関数が表示されます。パラメータが設定されていない場合は、現在の SessionID が返されます。パラメータが設定されている場合、現在の SessionID は指定された値に設定されます。

永続的な Cookie を使用し、「session_id」関数を追加する限り、永続的なセッション データを保存できます。

ただし、便宜上、サーバー設定の "session.name" を知る必要がありますが、一般のユーザーにはサーバーの php.ini 設定を表示する権限はありませんが、PHP には非常に優れた関数 "phpinfo" が用意されています。ほぼすべての PHP 情報を表示するために使用されます。

<?phpphpinfo();
ログイン後にコピー

エディタを開いて上記のコードを入力し、ブラウザでプログラムを実行すると、PHP 関連の情報が表示されます。 「session.name」パラメータがあります。これは必要なサーバーの「session.name」で、通常は「PHPSESSID」です。

SessionID の名前を書き留めると、永続的なセッション データ ストレージを実現できます。

<?phpsession_start();ini_set('session.save_path','/tmp/');//6个钟头ini_set('session.gc_maxlifetime',21600);//保存一天$lifeTime = 24 * 3600;setcookie(session_name(), session_id(), time() + $lifeTime, "/");
ログイン後にコピー

さらに、php セッションの生存時間を設定するために、ネットユーザーがインターネット上で非常に優れた方法を書いているのを見つけました。ここでコードを共有します:

<?phpfunction start_session($expire=0){	if($expire==0){		$expire=ini_get('session.gc_maxlifetime');	}else{		ini_set('session.gc_maxlifetime',$expire);	}	if(empty($_COOKIE['PHPSESSID'])){		session_set_cookie_params($expire);		session_start();	}else{		session_start();		setcookie('PHPSESSID',session_id(),time()+$expire);	}}
ログイン後にコピー

使用方法も非常に簡単です。たとえば、次のとおりです。

<?php start_session(600);//600秒以后过期
ログイン後にコピー

追記: 実際、Cookie の保存時間は限られており、サーバーの容量も限られているため、本当の永久保存は不可能です...しかし、長期間保存する必要がある一部のサイトでは、上記の方法で十分です!

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

11ベストPHP URLショートナースクリプト(無料およびプレミアム) 11ベストPHP URLショートナースクリプト(無料およびプレミアム) Mar 03, 2025 am 10:49 AM

多くの場合、キーワードと追跡パラメーターで散らかった長いURLは、訪問者を阻止できます。 URL短縮スクリプトはソリューションを提供し、ソーシャルメディアやその他のプラットフォームに最適な簡潔なリンクを作成します。 これらのスクリプトは、個々のWebサイトにとって価値があります

Instagram APIの紹介 Instagram APIの紹介 Mar 02, 2025 am 09:32 AM

2012年のFacebookによる有名な買収に続いて、Instagramはサードパーティの使用のために2セットのAPIを採用しました。これらはInstagramグラフAPIとInstagram Basic Display APIです。

Laravelでフラッシュセッションデータを使用します Laravelでフラッシュセッションデータを使用します Mar 12, 2025 pm 05:08 PM

Laravelは、直感的なフラッシュメソッドを使用して、一時的なセッションデータの処理を簡素化します。これは、アプリケーション内に簡単なメッセージ、アラート、または通知を表示するのに最適です。 データは、デフォルトで次の要求のためにのみ持続します。 $リクエスト -

LaravelのバックエンドでReactアプリを構築する:パート2、React LaravelのバックエンドでReactアプリを構築する:パート2、React Mar 04, 2025 am 09:33 AM

これは、LaravelバックエンドとのReactアプリケーションの構築に関するシリーズの2番目と最終部分です。シリーズの最初の部分では、基本的な製品上場アプリケーションのためにLaravelを使用してRESTFUL APIを作成しました。このチュートリアルでは、開発者になります

Laravelテストでの簡略化されたHTTP応答のモッキング Laravelテストでの簡略化されたHTTP応答のモッキング Mar 12, 2025 pm 05:09 PM

Laravelは簡潔なHTTP応答シミュレーション構文を提供し、HTTP相互作用テストを簡素化します。このアプローチは、テストシミュレーションをより直感的にしながら、コード冗長性を大幅に削減します。 基本的な実装は、さまざまな応答タイプのショートカットを提供します。 Illuminate \ support \ facades \ httpを使用します。 http :: fake([[ 'google.com' => 'hello world'、 'github.com' => ['foo' => 'bar']、 'forge.laravel.com' =>

PHPのカール:REST APIでPHPカール拡張機能を使用する方法 PHPのカール:REST APIでPHPカール拡張機能を使用する方法 Mar 14, 2025 am 11:42 AM

PHPクライアントURL(CURL)拡張機能は、開発者にとって強力なツールであり、リモートサーバーやREST APIとのシームレスな対話を可能にします。尊敬されるマルチプロトコルファイル転送ライブラリであるLibcurlを活用することにより、PHP Curlは効率的なexecuを促進します

Codecanyonで12の最高のPHPチャットスクリプト Codecanyonで12の最高のPHPチャットスクリプト Mar 13, 2025 pm 12:08 PM

顧客の最も差し迫った問題にリアルタイムでインスタントソリューションを提供したいですか? ライブチャットを使用すると、顧客とのリアルタイムな会話を行い、すぐに問題を解決できます。それはあなたがあなたのカスタムにより速いサービスを提供することを可能にします

2025 PHP状況調査の発表 2025 PHP状況調査の発表 Mar 03, 2025 pm 04:20 PM

2025 PHP Landscape Surveyは、現在のPHP開発動向を調査しています。 開発者や企業に洞察を提供することを目的とした、フレームワークの使用、展開方法、および課題を調査します。 この調査では、現代のPHP Versioの成長が予想されています

See all articles