講述php設置session有效期「php開啟session代碼」

Session 的工作機制

客戶端第一次訪問某服務器,為每個訪問者創建一個唯一的 id (UID),並基於這個 UID 來存儲變量。UID 存儲在 cookie 中,亦或通過 URL 進行傳導。

sessionID的生產算法原理如下:

hash_func = md5 / sha1 #可由php.ini配置 sessionID = hash_func(客戶端IP + 當前時間(秒)+ 當前時間(微妙)+ PHP自帶的隨機數生產器)

hash_func(*)中的數據採樣值的內容分析,多個用戶在同一台服務器時所生產的sessionID重複的概率極低(至少為百萬份之一)。

黑客如果要猜出某一用戶的sessionID,則他也必須知道「客戶端IP、當前時間(秒、微妙)、隨機數」等數據方可模擬。

php.ini配置如下:

; Select a hash function for use in generating session ids.
; Possible Values
; 0 (MD5 128 bits)
; 1 (SHA-1 160 bits)
; This option may also be set to the name of any hash function supported by
; the hash extension. A list of available hashes is returned by the hash_algos()
; function.
; http://php.net/session.hash-function
session.hash_function=0

PHP session工作原理

session 技術相當於Cookie技術的升級版,Cookie的工作機制是將信息記錄在客戶端,而Session技術是將信息存放在服務器端,服務器存儲信息的方式有很多,可以是文件、數據庫和內存等,這裡以文件的存儲方式介紹session的工作步驟。

(1)客戶端第一次訪問某服務器。
(2)服務器通過Cookie發送sessionID給客戶端,並在服務器建立一個與sessionID同名的文件用於存儲信息,而sessionID不能重複,即不同的客戶端的sessionID是不同的。
(3)客戶端再次訪問服務器時會攜帶服務器發送給客戶端的sessionID。
(4)服務器根據客戶端發送的sessionID查找對應的文件,讀取文件內容。

通過上面的步驟可以看出,session的工作依賴cookie的工作,當然不用Cookie也可以實現sessionID的傳遞,如URL,但是用cookie最方便。

PHP本身的session是如何工作的呢

首先,在需要共享客戶端信息的文件中通過session_start()函數開啟session, 然後就可以向$_SESSION全局數組中存入或讀取數據,而$_SESSION數組與其他數組不同的是,當向該數組中添加數據時,PHP還會將其中的數據系列化寫入session文件中,每次開啟session時,PHP會將session文件中的數據讀取到該全局數組中,實現數據共享的功能。

php_cli模式通過session_id()使用session

可以通過它來獲取當前會話的PHPSESSID,也可以通過它來設置當前的會話PHPSESSID。 php_cli模式下可以通過設置這個,達到使用session的目的,非常方便。

例如:

<?php
// session_id('vingbrv8m64asth0nhplu9gmb7');
session_start();
$_SESSION[md5(rand(100,999))] = rand(100,999);
var_dump($_SESSION);

下面看看一個實際例子,助你加強對session的認識

//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);
 }
 }
 return true;
}

補充–涉及到的函數

session_start();// 開啟session回話,其中session_id()的值是一次獨立會話的標誌
session_name(); // 默認是PHPSESSID,在php.ini文件中可以自行配置。
session_id(); // 在cookie中的體現是,session_name為鍵,session_id為值
setcookie(); // 要想起作用,必須有頁面的刷新
session_destory(); // session_destroy — 銷毀一個會話中的全部數據

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/268116.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-16 13:07
下一篇 2024-12-16 13:07

相關推薦

發表回復

登錄後才能評論