首頁 後端開發 php教程 php中關於Session的使用詳解

php中關於Session的使用詳解

May 22, 2018 am 11:29 AM
php session 快取

在學習php過程中會遇到快取問題,本文將詳解其相關內容。

Session的宣告與使用

Session的設定不同於Cookie,必須先啟動,在PHP中必須呼叫session_start()。 session_start()函數的語法格式如下:

Bool session_start(void) //建立Session,開始一個會話,進行Session初始化

注意:session_start()函數之前不能有任何輸出

當第一次造訪網站時,Seesion_start()函數就會建立一個唯一的Session ID,並自動通過HTTP的回應頭,將這個Session ID儲存到客戶端Cookie。同時,也在伺服器端建立以Session ID命名的文件,用於保存這個使用者的會話資訊。當同一個使用者再次造訪這個網站時,也會自動透過HTTP的請求頭將Cookie中儲存的Seesion ID再攜帶過來,這時Session_start()函數就不會再去分配一個新的Session ID,而是在伺服器的硬碟中去尋找和這個Session ID同名的Session文件,將這之前為這個用戶保存的會話資訊讀出,在當前腳本中應用,達到跟踪這個用戶的目的。 Session以數組的形式使用,如:$_SESSION['session名']

註冊一個會話變數和讀取Session

在PHP中使用Session變量,除了要啟動之外,還要經過註冊的過程。註冊並讀取Session變量,都要透過存取$_SESSION數組完成。在$_SESSION關聯數組中的鍵名具有和PHP中普通變數相同的命名規則。註冊Session變數的程式碼如下所示:

程式碼如下

//启动session的初始化
session_start();
//注册session变量,赋值为一个用户的名称
$_SESSION["username"]="skygao";
//注册session变量,赋值为一个用户的ID
$_SESSION["uid"]=1;
>
登入後複製

執行該腳本後,兩個Session變數就會被儲存在伺服器端的某個檔案中,該檔案的位置是透過php.ini文件,在session.save_path屬性指定的目錄下。

註銷變數與銷毀Session

當使用完一個Session變數後,可以刪除,當完成一個會話後,也可以將其銷毀。如果用戶退出Web系統,就需要提供他一個註銷的功能,把他的所有資訊都在伺服器中銷毀。銷毀和目前Session有關的所有的資料,可以呼叫session_destroy()函數結束目前的會話,並清空會話中的所有資源。該函數的語法格式如下所示:

bool session_destroy(void) //銷毀和當前Session有關的所有資料

該函數並不會釋放和當前Session相關的變量,也不會刪除儲存在客戶端Cookie中的Session

ID。因為$_SESSION數組和自訂的數組在使用上是相同的,所以我們可以使用unset()函數來釋放在Session中註冊的單一變數。如下所示:

unset($_SESSION['鍵名']);

#一定要注意,不要使用unset($_SESSION)刪除整個$_SESSION數組,這樣將不能再通過$_SESSION超全域數組註冊變數了。但如果想把某個使用者在Session中註冊的所有變數都刪除,可以直接將陣列變數$_SESSION賦上一個空數組。如下所示:

$_SESSION=array()

PHP預設的Session是基於Cookie的,Session

ID被伺服器儲存在客戶端的Cookie中,所以在註銷Session時也需要清除Cookie中儲存的SessionID,而這必須藉助setCookie()函數完成。在PHP腳本中,可以透過呼叫session_name()函數來取得Session名稱。刪除儲存在客戶端Cookie中的Session

ID,程式碼如下所示:

#程式碼如下

//判斷Cookie中是否存在session ID

if(isset($_COOKIE[session_name()])){

//刪除包含Session ID的cookie,注意第四個參數一定要和php.ini設定的路徑相同

#setcookie(session_name(),'',time()-3600,'/');

}

>

透過前面的介紹可以總結出, Session的註銷過程共需要4個步驟。在下例中,提供完整的四個步驟程式碼,執行該腳本就可以關閉Session,並銷毀與本次會話相關的所有資源。程式碼如下所示:

程式碼如下

//第一步:开启Session并初始化
session_start();
//第二部:删除所有Session的变量,也可以用unset($_SESSION[XXX])逐个删除
$_SESSION = array();
//第三部:如果使用基于Cookie的session,使用setCookkie()删除包含Session ID的cookie
if(isset($_COOKIE[session_name()])) {
setCookie(session_name(), "", time()-42000, "/");
}
登入後複製

//第四部:最後徹底銷毀session

session_destroy();
>
session的phpini配置选项
php.ini文件和Session有关的几个常用配置选项:
session.auto_start = 0 ; 在请求启动时初始化session
session.cache_expire = 180 ; 设置缓存中的会话文档在 n 分钟后过时
session.cookie_lifetime = 0 ; 设置按秒记的cookie的保存时间,相当于设置Session的过期时间,为0时表示直到浏览器被重启
登入後複製

session.auto_start=1,這樣就不需要每次使用session之前都要呼叫session_start()不建議使用.但啟用該選項也有一些限制,如果確實啟用了session.auto_start,則不能將物件放入會話中,因為類別定義必須在啟動會話之前加載以在會話中重建對象。

session.cookie_path = / ; cookie的有效路径
session.cookie_domain = ; cookie的有效域
session.name = PHPSESSID; 用在cookie里的session的名字
session.save_handler = files ; 用于保存/取回数据的控制方式
session.save_path = /tmp ; 在 save_handler 设为文件时传给控制器的参数, 这是数据文件将保存的路径.
session.use_cookies = 1 ; 是否使用cookies
登入後複製

Session的垃圾自動回收機制

可以通过session_destroy()函数在页面中提供一个“退出”按钮,通过单击销毁本次会话。但如果用户没有单击退出按钮,而是直接关闭浏览器,或断网等情况,在服务器端保存的Session文件是不会删除的。虽然关闭浏览器,下次需要重新分配一个新的Session ID重新登录,但这只是因为在php.ini中的设置seesion.cookie_lifetime=0,来设定Session ID在客户端Cookie中的有效限期,以秒为单位指定了发送到浏览器的Cookie的生命周期。当系统赋予Session有效期限后不管浏览器是否开启,Session ID都会自动消失。而客户端Session ID消失服务器端保存的Session文件并没有被删除。所以没有被Sessoin ID引用的服务器端Session文件,就成为了“垃圾”。

服务器保存的Session文件就是一个普通文本文件,所以都会有文件修改时间。“垃圾回收程序”启动后就是根据Session文件的修改时间,将所有过期的Session文件全部删除。通过在php.ini中设置session.gc_maxlifetime选项来指定一个时间(单位:秒),例如设置该选项值为1440(24分钟)。“垃圾回收程序”就会在所有Session文件中排查,如果有修改时间距离当前系统时间大于1440秒的就将其删除。

“session垃圾回收程序”是怎样的启动机制呢“垃圾回收程序”是在调用session_start()函数时启动的。而一个网站有多个脚本,没有脚本又都要使用session_start()函数开启会话,又会有很多个用户同时访问,这就很可能session_start()函数在1秒内被调用N次,而如果每次都会启动“session垃圾回收程序”,这样是很不合理的。可以通过php.ini文件中修改“session.gc_probability和session.gc_pisor”两个选项,设置启动垃圾回收程序的概率。会根据“session.gc_probability/session.gc_pisor”公示计算概率,例如选项session.gc_probability=1,而选项session.gc_pisor=100,这样的概率就是“1/100”,即session_start()函数被调用100次才会有一次可能启动“垃圾回收程序”。

php.ini中相关的配置

session.cookie_lifetime=0; 关闭浏览器相应的cookie文件即被删除
session.gc_maxlifetime; 设置过期session时间,默认1440秒(24分钟)
session.gc_probability/session.gc_pisor; 启动垃圾回收机制的概率(建议值为1/1000——5000)
登入後複製

cookie禁用时通过URL传递session的ID

使用Session跟踪一个用户,是通过在各个页面之间传递唯一的Session ID,并通过Session ID提取这个用户在服务器中保存的Session变量。常见的Session ID传送方法有以下两种。

第一种方法是基于cookie的方式传递session ID,这种方式更优,但不总是可用, 因为用户在客户端可以屏蔽cokie;

第二种方法是通过url参数进行传递,直接将session ID嵌入到URL中去。

在Session的实现中通常都是采用Cookie的方式,客户端保存的Session ID就是一个Cookie。当客户禁用Cookie时,Session ID就不能在Cookie中保存,也就不能在页面之间传递,此时Session失效。不过PHP5在Linux平台可以自动检查Cookie状态,如果客户端禁用它,则系统自动把Session ID附加到URL上传送。而使用Windows系统作为Web服务器则无此功能。

在PHP中提出了跟踪Session的另一种机制,如果客户浏览器不支持Cookie,则PHP可以重写客户请求的URL,把Session ID添加到URL信息中。可以手动地在每个超链接的URL中都加上一个Session ID,但工作量比较大,不建议使用这种方法。如下所示:

代码如下

//开启session

session_start();

//在每个URL后面附加上参数,变量名为session_name()获取名称,值通过session_id()获取

echo '连接演示';

>

在使用Linux系统做服务器时,则在编辑PHP时如果使用了–enable-trans-sid配置选项,和运行时选项session.use_trans_sid都被激活,在客户端禁用Cookie时,相对URL将被自动修改为包含会话ID。如果没有这么配置,或者使用Windows系统作为服务器时,可以使用常量SID。该常量在会话启动时被定义,如果客户端没有发送适当的会话Cookie,则SID的格式为session_name=session_id,否则就为一个空字符串。因此可以无条件地将其嵌入到URL中去。在下例中使用两个脚本程序,演示了Session ID的传送方法。

session_start();
$_SESSION["username"]="admin";
echo "session ID:".session_id()."
";
登入後複製

本篇详解了session的相关问题,更多相关知识请关注php中文网。

相关推荐:

php中die(),exit(),return的区别介绍

SQL 中 on 条件与 where 条件的区别

关于php 压缩CSS代码的方法

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

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 Dec 24, 2024 pm 04:42 PM

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

CakePHP 日期和時間 CakePHP 日期和時間 Sep 10, 2024 pm 05:27 PM

為了在 cakephp4 中處理日期和時間,我們將使用可用的 FrozenTime 類別。

討論 CakePHP 討論 CakePHP Sep 10, 2024 pm 05:28 PM

CakePHP 是 PHP 的開源框架。它旨在使應用程式的開發、部署和維護變得更加容易。 CakePHP 基於類似 MVC 的架構,功能強大且易於掌握。模型、視圖和控制器 gu

CakePHP 檔案上傳 CakePHP 檔案上傳 Sep 10, 2024 pm 05:27 PM

為了進行文件上傳,我們將使用表單助理。這是文件上傳的範例。

CakePHP 建立驗證器 CakePHP 建立驗證器 Sep 10, 2024 pm 05:26 PM

可以透過在控制器中新增以下兩行來建立驗證器。

如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 Dec 20, 2024 am 11:31 AM

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

CakePHP 快速指南 CakePHP 快速指南 Sep 10, 2024 pm 05:27 PM

CakePHP 是一個開源MVC 框架。它使應用程式的開發、部署和維護變得更加容易。 CakePHP 有許多函式庫可以減少大多數常見任務的過載。

您如何在PHP中解析和處理HTML/XML? 您如何在PHP中解析和處理HTML/XML? Feb 07, 2025 am 11:57 AM

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

See all articles