php永続セッション(転送)

WBOY
WBOYオリジナル
2016-06-23 14:31:191192ブラウズ

原則:

1. ブラウザーが Cookie を有効にし、PHP が session_start(); を呼び出すと、

初めてページにアクセスしたとき (リクエストにセッション情報が含まれていない場合)、サーバーはセッション ID を生成し、 「応答ヘッダー情報」(初めて返されます)ページにアクセスするとき、ブラウザは「リクエストヘッダー情報」にセッション ID を含めます

Php コード

Cookie PHPSESSID=a2e6b7db91b89014344c254c1db0c086 2. ブラウザが Cookie を無効にしている場合は、URL を使用する必要があります。セッション ID を渡します

各 URL のすべての Pass SESSIONID

で使用でき、PHP ページの先頭で手動で設定します

PHP コード

if(isset($_GET['SESSIONID']) ){ session_id($_GET['SESSIONID']) ; id

セッション名は呼び出す前に session_name($sname) を使用して設定できます (デフォルトは PHPSESSID)

既知の効果的な方法は、session_set_save_handler を使用してすべてのセッション管理作業を引き継ぐことです。この方法では、セッション情報はデータベースに保存され、SQL ステートメントを通じて期限切れのセッションを削除でき、セッションの有効期間を延長できます。正確に制御されています。これは、PHP ベースの大規模な Web サイトで一般的に使用される方法でもあります。しかし、通常の小規模なWebサイトであれば、そこまで時間と労力をかける必要はないようです。
ただし、一般的なセッションの有効期間は制限されており、ユーザーがブラウザを閉じると、セッション変数は保存できません。では、どうすればセッションの永続的な寿命を達成できるでしょうか?
ご存知のとおり、セッションはクライアントから提供されたセッション ID に基づいてサーバー側に保存され、そのファイルはクライアントの Cookie を使用して変数の値を取得します。または、アクセスされたHttp1.1プロトコルのQuery_String(URLの「?」以降の部分)をサーバーに送信し、サーバーがセッションのディレクトリを読み込む...
永続化を実現するにはセッションの設定を行うには、まず php.ini のセッションの関連設定を理解する必要があります (php.ini ファイルを開き、「[セッション]」セクションにあります):
1. session.use_cookies: デフォルト値は「1」です。これは、SessionID が Cookie によって渡されることを意味し、それ以外の場合は Query_String によって渡されます。
2. session.name: これは、SessionID が保存される場所です。変数名は、渡すために Cookie または Query_String にすることができます。デフォルト値は "PHPSESSID" です。
3. session.cookie_lifetime: これは、セッション ID がクライアント Cookie に保存される時間を表します。デフォルトは 0 です。これは、ブラウザがセッション ID を閉じることを意味します。これは、セッションが永続的に使用できないためです。 !
4. session.gc_maxlifetime: セッション データがサーバー側に保存される時間です。この時間を超えると、セッション データは自動的に削除されます。
多くの設定がありますが、これらはこの記事に関連するものです。まず、永続セッションを使用するための原則と手順を説明します。
前に述べたように、サーバーは SessionID を通じてセッション データを読み取りますが、通常、ブラウザーによって送信された SessionID はブラウザーを閉じると失われるため、SessionID を手動で設定して保存するだけで済みます。それ以外の場合は問題ありません...
サーバーの操作権限を持っている場合、これを設定するのは非常に簡単です。次の手順を実行するだけです。
1. 「session.use_cookies」を 1 に設定し、セッション ID を保存するための Cookie をオンにします。デフォルトは 1 で、通常は変更する必要はありません。
2. 「session.cookie_lifetime」を正の無限大に変更します (もちろん、正の無限大のパラメーターはありませんが、999999999 と正の無限大には違いはありません)。 session.gc_maxlifetime" を "session.cookie_lifetime" と同じ時間にします ;
セッションの有効期間を設定するためのパラメータは session.gc_maxlifetime であることが PHP ドキュメントに明記されています。このパラメータは、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」関数が表示されます。パラメータが設定されていない場合は、現在のセッション ID が返されます。パラメータが設定されている場合は、現在のセッション ID が指定された値に設定されます。
永続的な Cookie を使用し、「session_id」関数を追加する限り、永続的なセッション データを保存できます。
ただし、便宜上、サーバー設定の「session.name」を知る必要がありますが、ほとんどのユーザーはサーバーの php.ini 設定を表示する権限を持っていません。ただし、PHP には非常に優れた関数「phpinfo」が用意されています。ほぼすべての PHP 情報を表示するために使用されます。
----------------------------------------------- ----------------------------------
PHP 関連情報表示
< ;?phpinfo()?>
-------------------------------------- - ----------------------------------------
エディターを開く上記のコードをブラウザで実行すると、PHP 関連の情報が表示されます (図 1 を参照)。 「session.name」パラメータがあります。これは必要なサーバーの「session.name」で、通常は「PHPSESSID」です。
SessionID の名前を書き留めると、永続的なセッション データ ストレージを実現できます。
次のようにコードをコピーします:
session_start();
ini_set('session.save_path','/tmp/');
//6 時間
ini_set('session.gc_maxlifetime',21600);ある日
$lifeTime = 24 * 3600;
setcookie(session_name(), session_id(), time() + $lifeTime, "/");

追記:

実際、ストレージのせいで真の永久保存は不可能ですCookie の数 時間は限られており、サーバーのスペースも限られています...ただし、長期間保存する必要がある一部のサイトの場合は、上記の方法で十分です。

PHP はデフォルトでセッションをファイルの形式で保存します。これはファイルスペースのオーバーヘッドが非常に小さい Windows でのみ使用できますが、uinx または liux でファイルシステムを使用する場合は、次のようにファイルスペースのオーバーヘッドが発生します。システムは非常に大規模ですが、多数のユーザーが常にセッションを使用する必要があるため、サーバー全体にパフォーマンスの問題が発生します。 、セッションの一貫性を維持できないため、データベース方式を使用してセッションを保存する必要があります。この方法では、同時に使用されるサーバーの数に関係なく、セッションを 1 つのデータベース サーバーに保存するだけで済みます。セッションは完全に保存されます。実装方法の詳細については、引き続きお読みください。

デフォルトでは、PHP セッションはファイル形式で保存されます。PHP 設定ファイル php.ini に、session.save_handler="files" という行があります。これは、ファイルがセッションの保存に使用されることを意味します。セッションを保存するためにデータベースを使用したい場合は、セッションをサポート モードに変更し、名前を session.save_handler="use" に変更する必要があります。ただし、これはセッションの保存にファイルを使用しないことを意味するだけです。データベースを作成するには、データベースとテーブルも選択する必要があります。

データベースとデータベースのテーブル構造を確立するには、PHP と MySQL の組み合わせが最適なので、名前を変更することもできます。同時に、MySQL にはトランザクション機能がないため、他のデータベースよりも高速ですが、セッション ファイルの保存にはトランザクション処理が必要ないため、より適切に実行することにしました。
データベースを作成します。 CREATE DATABASE 'session'; テーブル構造を作成します。 CREATE TABLE 'session'( id CHAR(30) NOT NULL , 'user 'CHAR(30), data CHAR(3000) ,PARMIRY BY ('id') );
PHP ファイルを書く

PHP コード

  

はsession_user_start.phpとして保存されています。


a.te.com と b.te.com のセッションは分離されています

www.te.com も取得できません.te.com のセッション

ただし、a.te.com も www.te.com のセッション

に到達できませんでした。 sessionid

Php代コード

3600, 'path' => '/', 'ドメイン' => '.phptest.com', 'secure' => false, 'httponly ' => true、 );   call_user_func_array('session_set_cookie_params', $cookieParams);   セッション開始();   var_dump(session_id()); 

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