session_id()和session_regenerate_id()對原來session文件和其中數據是怎麼處理的

 

 



1、session_id()對原來session文件和裏面的數據,是怎麼處理的?php

 



測驗辦法:
<?php

$sid = md5("aaad");
session_id($sid);
session_start();
var_dump(session_id());
$_SESSION['ddd'] = 123;


?>

web

 



是新建立一個session文件。

那麼原來PHPSESSID對應的服務器上的數據就不會用到了,由於新建立了一個文件。

api

 

 

2、研究上面這個有什麼用途?服務器

 

業務中須要cookie

 

 

問題的背景:
 * um.mama.cn/passport 和passport.mama.cn都是訪問新版本passport系統。
 *
 * 當app跳轉到網頁時,app先在打開的webview中,請求passport的一個接口。
 * app>>>>>http://passport.mama.cn/appapi/setWebViewSession?app_code=xxx
 * passport驗證成功後,會設置webview爲登陸狀態(即把登陸狀態存儲到memcache)
 *
 * 但,網頁訪問的域名倒是um.mama.cn/passport,兩個域名不一樣,PHPSESSID就不一樣。以前設置的登陸狀態沒法同步到um.mama.cn域名
 *
 * 目前思路是:登陸狀態是放在共享位置-memcache中,登陸狀態要想共享,讓兩個域名的PHPSESSID保持同樣便可。一樣的sid,能夠去memcache查詢數據。
 *
 * 具體作法是:
 * app請求接口時,設置登陸狀態後,順便將passport.mama.cn的sid備份到一個讓passport.mama.cn也能讀取的公共域名下:mama.cn
 * 進入um.mama.cn時候,從mama.cn獲取備份的sid,因而將um.mama.cn的sid重置session

 

代碼以下:app

<?phpcode

if(isset($_COOKIE['app_passport_login_sid']) && $_COOKIE['app_passport_login_sid']){
    
    $sid = trim($_COOKIE['app_passport_login_sid']);
    session_id($sid);
    setcookie(session_name(), $sid, time()+86400, '/');
    session_start();
    //這個cookie用完畢後刪除掉,避免影響
    setcookie('app_passport_login_sid', $sid, time()-86400, '/','.mama.cn');
}接口

 

?>md5

 

 

我想知道session_id()重置爲指定的sid,有如下疑惑,解決這些疑惑以便評估對業務的影響:

重置爲一個sid,是新建立一個session文件?仍是把原來的session文件重命名便可呢?

若是是新建立一個新的session文件,那麼:php會對原來的磁盤上的session文件怎麼處理呢?

 

 

經過上面的試驗,答案爲:

一、只是新建立一個session文件。並且是一個空文件。之前文件的數據並不會帶到新文件中

二、原來的session文件並不會刪除掉。保留在磁盤上。估計是垃圾回收機制的時候會自動刪除?

 

 

 

3、順便研究session_regenerate_id()對原來的session文件和數據的處理方式

 

只是將原來的文件名稱重命名爲一個新的麼。這樣數據仍是在的。


session_regenerate_id() 在不修改當前會話中數據的前提下使用新的 ID 替換原有會話 ID。


delete_old_session

    是否刪除原 ID 所關聯的會話存儲文件。


這個看介紹:拷貝一份原來的session數據文件,而後重命名爲一個新的sid名稱

好比,session_sid1 新建了一個文件 session_sid2

原來的數據文件會帶到新的session文件中去的。



測驗辦法:

session_start();
session_regenerate_id();
var_dump(session_id());



相關文章
相關標籤/搜索