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());