理解PHP的SESSION機制

不言
發布: 2023-03-24 06:28:01
原創
1568 人瀏覽過

這篇文章主要介紹的內容是關於理解PHP的SESSION機制,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

徹底理解PHP的SESSION機制





#

一、預設機制,用磁碟檔案來實作PHP會話。 php.ini設定:session##.save_handler = files
#  1 、session_start()
    A、 session_start()是session機制的開始,它有一定機率開啟垃圾回收, 因為session是存放在檔案中,      PHP本身的垃圾回收是無效的,SESSION的回收是要刪檔案的,這個機率是根據php
. ini的配置決定的,      但是有的系統是session
.gc_probability ##=0##gc_probability ##=##0
##,這也就是說機率是0,而是透過cron腳本來實現垃圾回收。
              session.gc_probability =# #1 #.gc_pisor ##=
1000              session#o#.
##編號#編號#_編號#_編號#3#編號#編號#編號#編號#編號#編號#3#編號#編號#3#編號#3#編號#」 =1440

//
過期時間預設24分鐘
              //機率為session.gc_probability/session.gc_sorpi7/1/10 ##              //不建議設定太小,因為session的垃圾回收,是需要檢查每個檔案是否過期的。
              session.save_path =
/
#save_path 
#好像不同的系統預設不一樣,有一種設定是"N;/path"              //這是隨機分級存儲,這樣的話,垃圾回收將不起作用,需要自己寫腳本
    B、 session會判斷目前是否有$_COOKIE#[session_name#$_COOKIE
####[######session_name# #####()];######session_name######()傳回儲存session_id的COOKIE鍵值,###這個值可以從php
.ini找到

              session
.name = PHPSESSID //默認值PHPSESSID
             

    C 、 如果不存在會產生一個session_id,#然後把產生的session_id當作COOKIE的值傳遞到客戶端.
      相當於執行了下面COOKIE 操作,注意的是,這一步執行了setcookie()操作,COOKIE是在header頭中發送的,
    這之前是不能另外有輸出的,PHP]這之前是不能有輸出的,PHP 這之前是不能有輸出的,PHP 這之前是不能有輸出的,PHP.一個函數 
session_regenerate_id() 如果使用這個函數,這之前也是不能有輸出的。

                
setcookie(session_name(),
                          
#session_id##1        session.cookie_lifetime





###############################。 ###,######//######預設0################                    ######,######//######預設'/'目前程式跟目錄下都有效###############              ####.######cookie_domain######,######//######預設為空############# #                         )且為###########################################################################################
    D、 如果存在那麼session_id =$_COOKIE##[session_name##];#      然後去session
.
save_path指定的資料夾裡去找名字為'SESS_##'.session_id()的檔案.      讀取檔案的內容反序列化,然後放到$_SESSION中

#  2
 為$_SESSION賦值    例如新加入一個值$_SESSION
[#'#test'='#blah'; 那麼這個$_SESSION只會維護在記憶體中,當腳本執行結束的時候,    用把$_SESSION的值寫入到session_id指定的資料夾中
,然後關閉相關資源.      這個階段有可能執行更改session_id的操作,    例如銷毀一個舊的的session_id,產生一個全新的session_id.
一半用在自訂session操作,角色的轉換上,    例如Drupal.
Drupal的匿名使用者有一個SESSION的,當它登入後需要換用新的session_id          

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

  ##、 
寫入SESSION操作
    在腳本結束的時候會執行SESSION寫入操作,把$_SESSION中值寫入到session_id命名的檔案中,可能已經存在,    可能需要建立新的檔案。
#


  4、 銷毀SESSION
    SESSION發出去的COOKIE一般屬於即時COOKIE,保存在記憶體中,當瀏覽器關閉後,才發出去的COOKIE一般屬於即時COOKIE,保存在內存中,當瀏覽器關閉後,才發出去的COOKIE一般屬於即時COOKIE,保存在內存中,當瀏覽器關閉後,才發出去的COOKIE一般屬於即時COOKIE,保存在內存中,當瀏覽器關閉後,才會過期,假如需要人為強製過期,
    比如退出登錄,而不是關閉瀏覽器,那麼就需要在代碼裡銷毀SESSION,方法有很多,
            
1setcookie(session_name(),session_id #(),time() #-8000000##,#..);//#退出登入前執行
           # #2usset($_SESSION);//這會刪除所有的$_SESSION數據,刷新後,有COOKIE傳過來,但沒有數據。
            3session_destroy();//這個作用更徹底,刪除$_SESSION 刪除session文件,和session_id
    當不關閉瀏覽器的情況下,再刷新,2和3都會有COOKIE傳過來,但找不到資料


二、由使用者自訂session處理機制。 php.ini設定:session##.save_handler = user      使用者自訂session處理機制,更加直覺
*session_set_save_handler('open'#,'close',#'read##','write'#,'destroy ','gc'); 
1 .session_start(),      執行open(
$save_path,$session_name)開啟session作業句柄      
$save_path 在session#$save_path 在session .save_handler = files的情況下它是session

.
save_path,但是如果使用者自訂定的話,這個兩個參數都用不上,直接回傳TRUE##      執行read($id)從中讀取資料. //
這個參數是自動傳遞的就是session_id(),可以透過這個值來操作。
    *2
.
腳本執行結束     執行write ($id,$sess_data#) //
兩個參數,很簡單#########
*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中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!