ホームページ  >  記事  >  バックエンド開発  >  PHPのSESSIONメカニズムを理解する

PHPのSESSIONメカニズムを理解する

不言
不言オリジナル
2018-04-16 15:50:321532ブラウズ

この記事の主な内容は、PHP の SESSION メカニズムを理解することです。これを必要とする友人に共有します。




1. デフォルトのメカニズムでは、ディスク ファイルを使用して PHP セッションを実装します。 php.ini 設定: session.save_handler = files
1. session_start()
A. session_start () はセッションメカニズムの始まりです。持っています一定の確率でガベージコレクションをオンにします,セッションはファイルに保存されるため、PHP 自体のガベージコレクションは無効です。この確率は php
.
ini の設定によって決まります。 しかし、一部のシステムは session
.
gc_probability =0、つまり確率は0ですが、ガベージコレクションはcronスクリプトを通じて実装されています。セッション =
1000
session.gc_maxlifetime =1440
/ /有効期限のデフォルトは 24 分です // 確率は session.gc_probability/session.gc_pisor です。 result is 1/1000, // セッションのガベージ コレクションでは各ファイルの有効期限が切れているかどうかを確認する必要があるため、小さすぎる値を設定することはお勧めできません。 //これは、このようなランダムな階層ストレージです。その場合、ガベージ コレクションは機能しないため、独自のスクリプトを記述する必要があります
B. セッションは、現在 $_COOKIE[session_name()];session_name

() が存在するかどうかを判断します。 session_id、
を保存する COOKIE キーの値を返します。この値は php .ini

から見つけることができます。存在しない場合、session_id が生成されます そして、生成された session_id は COOKIE の値としてクライアントに渡されます. , ʛen|| , COOKIEはヘッダーに送信されます, これより前に出力はありません、PHPは別の関数を持っています session_regenerate_id
() この関数を使用する場合、これより前に出力はありません。
session_id
(), session_ デフォルト 0e session.cookie_path,

//
デフォルト '/' 現在のプログラムとディレクトリが有効です

セッション.cookie_domain, , 认 // デフォルトは空です
) D. 存在する場合は session_id =$_COOKIE[session_name];
その後、session
.save_pathで指定されたフォルダーに移動して、の名前を見つけます' SESS_ '.session_id()ファイル.
ファイルの内容を読み取ってデシリアライズしてから
$_SESSION


2 $_SESSIONに値を代入します
$_SESSION['test'] =' blah'; then This $_SESSION はメモリ にのみ保持されます。 スクリプトの実行が終了すると、
$_SESSION の値を session_id
で指定されたフォルダーに書き込み、関連リソース . ‐ session_id を変更するために使用できます Drupal の匿名ユーザーは、ログインするときに新しい session_id を使用する必要があります

if (isset($_COOKIE[session_name()])) {
            setcookie(session_name(),'',time() -42000,'/');//旧session cookie过期
          }
          session_regenerate_id();//这一步会生成新的session_id
         //session_id()返回的是新的值

スクリプトがSESSION書き込み操作を終了したときに実行され、
$_SESSIONに値を書き込みますsession_id で指定されたファイルに、既に存在する可能性がありますが、
新しいファイルを作成する必要がある場合があります。


4. SESSIONを破棄する
SESSIONによって送信されたCOOKIEは通常、メモリに保存され、ブラウザを閉じると期限切れになります。有効期限を手動で強制する必要がある場合は、
たとえば、次のようにします。ブラウザを閉じるのではなく、ログアウトします。その場合は、
1time() -8000000という多くのメソッドがあります。 ,...);//ログアウトする前に実行 2usset( $_SESSION. );/ /これにより、$_SESSION データがすべて削除されます。更新後、COOKIE が渡されますが、データはありません。 ️
この場合、2と3の両方を再度更新してください。 COOKIE が送信されますが、データが見つかりません 2. セッション処理メカニズムは次のとおりです。ユーザーによってカスタマイズされました。 php.ini 設定: session.save_handler = user
ユーザー定義のセッション処理メカニズム、より直感的
*session_set_save_handler('open','close',' 読んでください'' write','destroy','gc'); session_start
(), open($save_path,$session_name
)を実行してセッション操作ハンドルを開きます. save_handler =
ファイルの場合, それはセッション.save_path, しかし、ユーザーがカスタマイズした場合、これらの2つのパラメータは使用されず、直接TRUEを返します Read($id)を実行しますそこからデータを読み取るための.//

このパラメータは自動的に session_id() に渡され、この値を通じて操作できます。
*2.スクリプト実行終了
write実行(
$id,$sess_data) //
2 つのパラメーター、非常にシンプルです     *3.假如用户需要session_destroy()
      先执行destroy
.在执行第2步

      一个实际例子:

     

 //SESSION初始化的时候调用
      function open($save_path,$session_name)
      {
        global$sess_save_path;
        $sess_save_path=$save_path;
        return(true);
      }

      //关闭的时候调用
      function close()
      {
        return(true);
      }

      function read($id)
      {
        global$sess_save_path;
        $sess_file="$sess_save_path/sess_$id";
        return (string) @file_get_contents($sess_file);
      }
      //脚本执行结束之前,执行写入操作
      function write($id,$sess_data)
      {
        echo"sdfsf";
        global$sess_save_path;

        $sess_file="$sess_save_path/sess_$id";
        if ($fp= @fopen($sess_file,"w")) {
          $return=fwrite($fp,$sess_data);
          fclose($fp);
          return$return;
        } else {
          return(false);
        }

      }

      function destroy($id)
      {
        global$sess_save_path;

        $sess_file="$sess_save_path/sess_$id";
        return(@unlink($sess_file));
      }

      function gc($maxlifetime)
      {
        global$sess_save_path;

        foreach (glob("$sess_save_path/sess_*") as$filename) {
          if (filemtime($filename) +$maxlifetime<time()) {
            @unlink($filename);
          }
        }
        returntrue;
      }

相关推荐:

PHP+redis实现session共享

PHP的SESSION反序列化使用详解

php创建session方法步奏详解

以上がPHPのSESSIONメカニズムを理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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