Session原理简述_PHP教程
Session存在的意义,估计每个用做web开发的人都是了解的,就为了解决HTTP是个无状态协议所带来的问题,不多说了。这里主要想说的是服务端与客户端是如何利用session进行交互的。
Session工作的大体流程
先看下面这幅流程图:
当用户第一次访问站点时,PHP会用session_start()函数为用户创建一个session ID,这就是针对这个用户的唯一标识,每一个访问的用户都会得到一个自己独有的session ID,这个session ID会存放在响应头里的cookie中,之后发送给客户端。这样客户端就会拥有一个该站点给他的session ID。
当用户第二次访问该站点时,浏览器会带着本地存放的cookie(里面存有上次得到的session ID)随着请求一起发送到服务器,服务端接到请求后会检测是否有session ID,如果有就会找到响应的session文件,把其中的信息读取出来;如果没有就跟第一次一样再创建个新的。
通常站点的退出功能,实际上就是调用一下session_destroy()函数(也有可能更复杂些),把该用户的session文件删除,再把用户的cookie清除。这样客户端和服务端就算没有联系了。
图中的红框部分就是一次完整的HTTP请求,因为HTTP是无状态的,所以一次请求完成后客户端和服务端就不再有任何关系了,谁也不认识谁。但由于一些需要(如保持登录状态等),必须让服务端和客户端保持联系,session ID就成了这种联系的媒介了。
客户端的工作
通过上面的分析我们可以知道session实际上是依赖与cookie的,当用户访问某一站点时,浏览器会根据用户访问的站点自动搜索可用的cookie,如果有可用的就随着请求一起发送到了服务端。每次接收到服务端的响应时又会更新本地的cookie信息。
当然也可以用GET方式来传递session ID,但不推荐用GET,这样不安全。
服务端的工作
由上面的流程图可以看到,服务端实际上是把产生的一些数据存放在了session文件中,该文件的名字就是”sess“加上session ID,这些文件的存放位置就是phpinfo()查到的session.savepath值。
由上图我们可以很清楚的看到,服务端和客户端保存着同样的session ID信息,这就是两者保持联系的钥匙。
Session的反面影响
有好处必然也有坏处,session带来的最主要问题就是对性能的影响,可以想象一下,对于一个千万用户级的web站点,如果每个用户都保存 session文件,那每次用户访问光寻找相应的session文件就要耗掉不少系统资源的。所以这时就要对session的存储做一些自定义的设定了, 如分目录或哈希等等。除了保存到session文件,也可以抛弃PHP自带的session功能,自己实现session,将session信息存放到数 据库当中,这样做最好对数据库进行一下缓存的设置了,不然对上千万的数据进行太频繁的检索,也是蛮耗资源的。
Session的清除
客户端和服务端的这种联系必然是需要有时间的规定的,所以需要定期清除session。这个问题就需要在两方面考虑了,一个是清除服务端session文件,一个是清除客户端的cookie信息,因为两者都各保存着一半的信息。
PHP GC进程可以扫描session存放目录清除session文件,但这个进程是特别耗资源的,所以PHP默认是1%的几率在一个sessioin启动时去 清理一次过期的sesssion,所以并不是说一个用户session过期了,他对应的session文件就马上被清除,99%的几率是没被清除的。这就 需要我们程序员自己动手了。可以在session信息中存放一个过期时间,值为用户最后一次访问的时间。当用户一访问,就用当前时间减去上次访问时间看是 否超时,如果超时了就删除相应session文件,并设置cookie的Expires属性为负值,使其客户端的cookie信息也过期,这样浏览器就自 动把它删掉了。
PHP的相关Session常用函数
- session_start() : 启动session,这个没什么说的了。根据session ID打开session文件,如果没有session ID就创建一个ID和对应的session文件
- $SESSION[]数组 : 存放用户信息的全局数组,session文件中除了存放$SESSION中的数据实际也会存放其他的信息,如id等
- sessionunset() : 清空$SESSION数组,它是把数组里的值清空了,而$SESSION这个变量还是存在的,和unset($SESSION)是完全不同的概念
- sessioncommit() : 提交session数据并结束session,把$SESSION数据写到文件里并结束session,实际上当一个页面执行结束后,php会自动执行与这个函数相同的操作。所以这个函数也很少能用上
- session_destroy() : 注销session,这个就是关闭session并删除掉相应的session文件了。切断了客户端和服务端的联系。

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

Vue.js與ASP.NET的結合,實現Web應用的效能最佳化和擴展的技巧和建議隨著Web應用的快速發展,效能最佳化成為開發者不可或缺的重要任務。 Vue.js作為一個流行的前端框架,與ASP.NET的結合可以幫助我們實現更好的效能最佳化和擴充。本文將會介紹一些技巧和建議,並提供一些程式碼範例。一、減少HTTP請求HTTP請求的數量直接影響Web應用程式的載入速度。透過

譯者|陳峻審校|重樓上世紀90年代,當人們提起軟體程式設計時,通常意味著選擇一個編輯器,將程式碼檢入CVS或SVN程式碼庫,然後將程式碼編譯成可執行檔。與之對應的Eclipse和VisualStudio等整合開發環境(IDE)可以將程式設計、開發、文件、建置、測試、部署等步驟納入到一個完整的軟體開發生命週期(SDLC)中,從而提高了開發人員的工作效率。近年來,流行的雲端運算和DevSecOps自動化工具提升了開發者的綜合能力,使得更多的企業能夠更輕鬆地開發、部署和維護軟體應用。如今,生成式AI作為下一代開

如何在ASP.NET程式中正確使用和最佳化MySQL連線池?引言:MySQL是一種廣泛使用的資料庫管理系統,它具有高效能、可靠性和易用性的特性。在ASP.NET開發中,使用MySQL資料庫進行資料儲存是常見的需求。為了提高資料庫連接的效率和效能,我們需要正確地使用和最佳化MySQL連接池。本文將介紹在ASP.NET程式中如何正確使用和最佳化MySQL連接池的方法。

如何在ASP.NET程式中重連MySQL連線?在ASP.NET開發中,使用MySQL資料庫是非常常見的。然而,由於網路或資料庫伺服器的原因,有時會導致資料庫連線中斷或逾時。在這種情況下,為了確保程式的穩定性和可靠性,我們需要在連線中斷後重新建立連線。本文將介紹如何在ASP.NET程式中實作重連MySQL連線的方法。引用必要的命名空間首先,在程式碼檔案的頭部引用

Vue.js與ASP.NET的結合,實現企業級應用的開發和部署在當今快速發展的互聯網技術領域,企業級應用的開發和部署變得越來越重要。 Vue.js和ASP.NET是兩個在前端和後端開發中廣泛使用的技術,將它們結合起來可以為企業級應用的開發和部署帶來許多優勢。本文將透過程式碼範例介紹如何使用Vue.js和ASP.NET進行企業級應用的開發和部署。首先,我們需要安裝

如何在ASP.NET程式中正確設定和使用MySQL連線池?隨著互聯網的發展和資料量的增加,對資料庫的存取和連接需求也不斷增加。為了提高資料庫的效能和穩定性,連接池成為了一個必備的技術。本文主要介紹如何在ASP.NET程式中正確配置和使用MySQL連接池,以提高資料庫的效率和回應速度。一、連接池的概念和作用連接池是一種重複使用資料庫連接的技術,在程式初始

如何在ASP.NET程式中正確使用並最佳化MySQL連線池的事務效能?在ASP.NET程式中,資料庫事務是非常重要的一環。事務可以確保資料庫的一致性和完整性,同時也可以提供更好的效能。而在使用MySQL資料庫時,利用連線池來管理連線資源和最佳化效能是不可或缺的。首先,讓我們簡單了解一下MySQL連接池的概念。連接池是一組連接的緩衝池,透過預先初始化一定數量的數

ASP.NET中的內建物件有「Request」、「Response」、「Session」、「Server」、「Application」、 「HttpContext」、「Cache」、「Trace」、「Cookie」和「Server.MapPath」:1、Request,表示客戶端發出的HTTP請求;2、Response:表示Web伺服器回傳給客戶端的HTTP回應等等。
