首頁 >後端開發 >PHP問題 >關於session的詳細理解

關於session的詳細理解

王林
王林轉載
2019-08-20 14:23:123463瀏覽

1、什麼是session

session的官方定義是:Session:在電腦中,尤其是在網路應用中,稱為「會話控制」。 Session 物件儲存特定使用者會話所需的屬性及設定資訊。

 說白了session就是可以維持伺服器端的資料儲存技術。 session主要有以下的這些特點: 

 1. session保存的位置是在伺服器端

 2. session一般來說是要配合cookie使用,如果是瀏覽器停用了cookie功能,也就只能夠使用URL重寫來實現session儲存的功能

 3. 單純的使用session來維持使用者狀態的話,那麼當同時登入的使用者數量較多的時候,或者存在較多的數量的session會導致查詢慢的問題

 本質上:session技術就是一種基於後端有別於資料庫的臨時儲存資料的技術

2、為什麼要有session

主要的一個原因就是HTTP的無狀態性

 因為HTTP的無狀態性,所以我們沒有辦法在HTTP發送請求的時候知道目前使用者的狀態,也就是比如說,當前是哪個用戶的之類的這種信息,所以這個時候我們需要session來標識當前的狀態

3、session的工作原理

 接下來,透過一個模擬使用者登入的流程圖來初步理解session的原理,假設這個時候使用者執行登入操作,具體的session工作流程如下:

關於session的詳細理解

整個流程大概分成這樣的幾步:

1. 第一步將本地的cookie中的session標識和用戶名,密碼帶到後台中

2. 第二步後台偵測有沒有對應的session標識,我們以php為例,那麼就是偵測有沒有接收到對應的PHPSESSID

3. 沒有的話直接產生一個新的session。有的話,檢測對應的檔案是否存在並且有效

3. 失效的話,我們需要清除session然後產生新的session。不失效,使用目前的session

看到這裡你可能對session的工作原理有初步的理解

session的原理圖如下:

關於session的詳細理解

4、session的常見設定

 我們這裡以PHP為例來講解關於session的設定

 首先我們要在PHP的安裝目錄下面找到php.ini文件,這個文件主要的作用是對PHP進行一些配置,具體以後涉及到再詳講。

  1. 設定session存放在cookie中中標識的欄位名,php中預設為PHPSESSID

  對應的設定為:session.name = PHPSESSID

  2. 如果用戶端停用了cookie,可以透過設定session.use_trans_sid來使識別的互動方式從cookie變成url傳遞

#    對應的設定為:session.use_trans_sid = 0

  3. 設定session的儲存位置

  對應的設定是session.save_path="D:\phpStudy\ PHPTutorial\tmp\tmp"

5、PHP中的session實戰

 首先我們需要安裝wamp#或是 phpstudy,具體方式自行百度

 為了方便觀察session檔案的變化,我們需要找到session的保存路徑(在php.ini中找到session.save_path),如下:

關於session的詳細理解

然後找到所指向的目錄,注意一般來說session是使用files的形式來保存的,但是我們也可以根據自己的實際情況進行修改。我們可以在php.ini檔案中進行修改和檢視。

關於session的詳細理解

 使用session的第一步,我們要開啟session,使用session_start(),然後我們為建立的session新增一個變量,我們假設為demo1,值為default ,程式碼如下:

<?php
/**
 * Created by PhpStorm.
 * Date: 2017/12/16
 */
session_start();// 打开session
$_SESSION["demo1"] = "default";
?>

執行效果如下:

關於session的詳細理解

開啟對應的文件,裡面的內容如下:

關於session的詳細理解

s:7 表示的是類型為string類型,長度為7個長度的字串

 如果我們對session中的內容進行重新編輯的話,效果如下:

關於session的詳細理解

我们观察最近一条的修改日期,我们可以发现就是日期发生了变化,但是文件名没有变化,也就是说,修改session中的内容不会导致文件被新建,而是执行对文件的重新写入操作

 session的销毁

 销毁session一般有两种方式,unsetsession_destroy,我们先来说说第一种

 代码如下:

<?php
/**
 * Created by PhpStorm.
 * Date: 2017/12/16
 */
session_start();// 打开session
$_SESSION["demo1"] = "default_1";
//session的销毁
unset($_SESSION);
?>

这一个相当于没有删除session文件,但是使得即使有对应的PHPSESSID也无法获取到相应的session

session_destroy()相对来说比较彻底,直接删除对应的session文件

<?php
/**
 * Created by PhpStorm.
 * Date: 2017/12/16
 */
session_start();// 打开session
$_SESSION["demo1"] = "default_1";
var_dump(session_name());
//session的销毁
session_destroy();
?>

關於session的詳細理解

对于个人来说比较推荐使用第二种方法,因为当要销毁session的时候,那么也就意味着session已经失效了,所以这个时候我们把它给删掉才是最好的处理方式,一方面可以减少对硬盘的存储,另外一方面可以相对优化session的查询速度。

 好了,这个时候我们应该要设置传递给浏览器端的cookie了,默认是自动传送,但是我们应该要学习的是怎样通过后端设置cookie过去

其中有两个方法与session有关的方法我们需要记住,第一个是session_name(),这个是获取cookie的key值得,第二个是session_id,这个是session的文件名

设置的示例代码:

<?php
/**
 * Created by PhpStorm.
 * Date: 2017/12/16
 */
session_start();// 打开session
$_SESSION["demo1"] = "default_1";
setCookie(session_name(),session_id(),time()-1000);
?>

在设置cookie的时候,我们为了程序的安全性,我们应该要禁止JS可以对cookie进行重写,所以需要设置HTTP ONLY,具体的设置方法在Php.ini中找到session.cookie_httponly

然后将其的值设置为1或者true即可

除此之外还可以通过setCookieini_set()来动态设置HTTPONLY属性

在使用session的时候,虽然会从浏览器把PHPSESSID传给后端,但是这个课程不需要人为的去参与。我们只需要保证HTTPONLY被设置就行了。下面是完整的代码:

<?php
/**
 * Created by PhpStorm.
 * Date: 2017/12/16
 */
session_start();// 打开session
if ($_SESSION) {
    var_dump($_SESSION["demo1"]);
} else {
    $_SESSION["demo1"] = "default_" . time();
    var_dump($_SESSION["demo1"]);
    setCookie(session_name(), session_id(), time(), NULL, NULL, NULL, true);
}

?>

6、session的相关注意事项

 1. 关闭浏览器session同样存在

 如果我们没有人为的去设置cookie的生命周期的时候默认关闭浏览器session的状态是无法被保存下来的,因为没有设置cookie的生命周期,默认这个时候cookie为session cookie也就是在会话存在的时候cookie才有效,所以关闭浏览器cookie失效,导致后端拿不到对应的PHPSESSID,所以无法找到对应的session文件

2.  session性能瓶颈怎样解决?

如果是后端存在大量的session的时候,那么这个时候就会出现性能的瓶颈,例如:当后端同时存在有5000个session文件的时候,假设要找的文件是在第4999个,那么也就是说前面至少需要遍历4998次,这样就会浪费过多的时间在后端的循环遍历查找文件中,所以这个时候最有效的方法是使用redis或者mongodb,原理是通过将原本保存在本地的session文件写入到内存中,通过内存换空间的形式来达到提升速度

3. 一般不使用URL重写的方法来传递PHPSESSID

其中主要有两个原因,一个是URL重写方式传递的话会导致URL混乱,影响美观。另一个是增大了用户误操作的几率

更多的session的相关配置请点击这里

7、更多的一些PHP.in中的session含义

[Session]

session.save_handler =的存储方式

session.use_cookies= 1 #使用cookies在客户端保存会话

session.use_only_cookies = 1 #去保护URL中传送session id的用户

session.name = PHPSESSID #session名称(默认PHPSESSID)

session.auto_start = 0 #不启用请求自动初始化session

session.cookie_lifetime = 0 #cookie存活时间(0为直至浏览器重启,单位秒)

session.cookie_path = / #cookie的有效路径

session.cookie_domain = #cookie的有效域名

session.cookie_httponly = #httponly标记增加到cookie上(脚本语言无法抓取)

session.serialize_handler = php #PHP标准序列化

session.gc_probability =1

session.gc_divisor =1000 #建议设置1000-5000

#概率=session.gc_probability/session.gc_divisor(1/1000)

#页面访问越频繁概率越小

session.gc_maxlifetime =1440 #过期时间(默认24分钟,单位秒)

session.bug_compat_42 = off #全域初始化session變數

session.bug_compat_warn = off

session.referer_check = off

session.referer_check" # = #防止帶有ID的外部URL

session.entopy_length = 0 #讀取的位元組

session.cache_limiter = { nocache,private,pblic} #HTTP緩衝類型

session.cache_expire = 180 #文檔過期時間(分鐘)

##session.use_trans_sid##o = 1 #trans_sid支援(預設0)

session.hash_function

 = 0 #hash方法{0:md5(128 bits),1:SHA-1(160 bits)}

session.hash_bits_per_character

 = 5 #當轉換二進位hash資料奧可讀形式是,每個字元保留位數

session.save_path 

= "/ var/lib/php/session" #session id存放路徑以上是session的詳細講解,更多相關問題請造訪PHP中文網:

https://www.php.cn/ ######

以上是關於session的詳細理解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:cnblogs.com。如有侵權,請聯絡admin@php.cn刪除