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名']
相關專題推薦:php session (包含圖文、視頻、案例)
註冊一個會話變數和讀取Session
在PHP中使用Session變量,除了要啟動之外,還要經過註冊的過程。註冊並讀取Session變量,都要透過存取$_SESSION數組完成。在$_SESSION關聯數組中的鍵名具有和PHP中普通變數相同的命名規則。註冊Session變數的程式碼如下所示:
2d06ed5fb15b10d20ed0b96cd5596fb8
執行該腳本後,兩個Session變數就會被儲存在伺服器端的某個檔案中,該檔案的位置是透過php.ini文件,在session .save_path屬性指定的目錄下。
註銷變數與銷毀Session
當使用完一個Session變數後,可以刪除,當完成一個會話後,也可以銷毀。如果用戶退出Web系統,就需要提供他一個註銷的功能,把他的所有資訊都在伺服器中銷毀。銷毀和目前Session有關的所有的資料,可以呼叫session_destroy()函數結束目前的會話,並清空會話中的所有資源。函數的語法格式如下所示:
bool session_destroy(void) //销毁和当前Session有关的所有资料
該函數並不會釋放和目前Session相關的變量,也不會刪除儲存在客戶端Cookie中的SessionID。因為$_SESSION數組和自訂的數組在使用上是相同的,所以我們可以使用unset()函數來釋放在Session中註冊的單一變數。如下所示:
unset($_SESSION['键名']);
一定要注意,不要使用unset($_SESSION)刪除整個$_SESSION數組,這樣將不能再透過$_SESSION超全域數組註冊變數了。但如果想把某個使用者在Session中註冊的所有變數都刪除,可以直接將陣列變數$_SESSION賦上一個空數組。如下所示:
$_SESSION=array()
PHP預設的Session是基於Cookie的,SessionID被伺服器儲存在客戶端的Cookie中,所以在登出Session時也需要清除Cookie中儲存的SessionID,而這必須藉助setCookie ()函數完成。在PHP腳本中,可以透過呼叫session_name()函數來取得Session名稱。刪除儲存在客戶端Cookie中的SessionID,程式碼如下所示:
40000d5da5a09bf9f762f8f3fc8cf2cf>
透過前面的介紹可以總結出,Session的註銷過程共需要4個步驟。在下例中,提供完整的四個步驟程式碼,執行該腳本就可以關閉Session,並銷毀與本次會話相關的所有資源。程式碼如下所示:
6ee5c7f84218ae64e4d5f014c2d118e4
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,但工作量比较大,不建议使用这种方法。如下所示:
<?php //开启session session_start(); //在每个URL后面附加上参数,变量名为session_name()获取名称,值通过session_id()获取 echo '<a href="demo.php?'.session_name().'='.session_id().'">连接演示</a>'; ?> 在使用Linux系统做服务器时,则在编辑PHP时如果使用了–enable-trans-sid配置选项,和运行时选项session.use_trans_sid都被激活,在客户端禁用Cookie时,相对URL将被自动修改为包含会话ID。如果没有这么配置,或者使用Windows系统作为服务器时,可以使用常量SID。该常量在会话启动时被定义,如果客户端没有发送适当的会话Cookie,则SID的格式为session_name=session_id,否则就为一个空字符串。因此可以无条件地将其嵌入到URL中去。在下例中使用两个脚本程序,演示了Session ID的传送方法。 <?php session_start(); $_SESSION["username"]="admin"; echo "session ID:".session_id()."<br>"; ?>
推荐教程: 《php教程》
以上是php中session用法詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!