1.sesion_start() 開啟session
_SESSION['b']='jin';
_SESSION[]=array();
//session_destroy(_SESSION['a']); //注銷變量
unset(_SESSION['c']);
echo session_id(); //每個session都有一個指定的ID
2.session_start()
_SESSION['b'] = '223';
3.setcookie(session_name(),session_id(),time()+3600);
setcookie(string name,string value,int expires,string path,string domain,int
secure,httponly)
expires失效日期,如果失效日期不設置,cookie將永遠有效,除非關閉瀏覽器時自動刪除cookie數(shù)據(jù),如果為cookie設置的失效時間,瀏覽器將會記住,只要沒到期,就存在。
path和domain域合起來指定URL或與cookie相關
secure關鍵字是在普通的HTTP鏈接中不發(fā)送cookie
4.void session_set_cookie_params ( int lifetime [, string path [, string domain [, bool secure [, bool httponly]]]] )
設置與這個session相關聯(lián)的session的細節(jié)來查看由會話控制設置的cookie內(nèi)容\
5.如何修改SESSION的生存時間。
答:
方法1:將php.ini中的session.gc_maxlifetime設置為9999,然后重啟apache,這是修改session文件在服務器的保存時間。
方法2:
lifeTime = 24 * 3600;
session_save_path(lifeTime);//這種情況只是cookie中找不到對應的session信息了,但是session還在服務器中。
session_start();
6.Session儲存于服務器端(默認以文件方式存儲session),根據(jù)客戶端提供的session id來得到用戶的文件,取得變量的值,session id可以使用客戶端的Cookie或者Http1.1協(xié)議的Query_String(就是訪問的URL的“?”后面的部分)來傳送給服務器,然后服務器讀取Session的目錄……。也就是說,session id是取得存儲在服務上的session變量的身份證。當代碼session_start();運行的時候,就在服務器上產(chǎn)生了一個session文件,隨之也產(chǎn)生了與之唯一對應的一個session id,定義session變量以一定形式存儲在剛才產(chǎn)生的session文件中。通過session id,可以取出定義的變量。跨頁后,為了使用session,你必須又執(zhí)行session_start();將又會產(chǎn)生一個session文件,與之對應產(chǎn)生相應的session id,用這個session id是取不出前面提到的第一個session文件中的變量的,因為這個session id不是打開它的“鑰匙”。如果在session_start();之前加代碼session_id($session id);將不產(chǎn)生新的session文件,直接讀取與這個id對應的session文件。 按照上面的思想,我只要把session_id存在在cookie中就可以正常使用session了。
7.session_id()
session_id() 存取目前 session 代號。
語法: string session_id(string [id]);
本函數(shù)可取得或者重新配置目前存放 Session 的代號。若無參數(shù) id 則表示只有取得目前 Session 的代號,加上參數(shù)則表示將 Session 代號設成新指定的 id。輸入及返回均為字符串。
<?php
session_start();
echo session_id();
// 輸出 dqr58dnuqj2gufvg4o3tmjb9v4
?>
設置 session_id()
<?php
session_id("NowaMagic");
session_start();
echo session_id();
// 輸出 NowaMagic
?>
8.PHP配置文件中session.save_path負責session文件的存放位置。
如果沒有配置則不會生成session文件,如果配置的目錄session.save_path = "E:/ttt"不存在,則會報錯:
Warning: session_start() [function.session-start]: open(E:/ttt\sess_e0b64760c92422d81c1d6202b66884f6, O_RDWR) failed: No such file or directory (2)
所以,如果需要生成session文件,需要檢查配置文件.如果沒有配置目錄,則請將php.ini中的“;session.save_path = "/tmp"” 改為“session.save_path = "E:/yourdir"”,并切記在E盤根目錄下新建,名為yourdir的文件夾。
設置完成后需要重啟服務,然后設置生效。
可以再php文件中測試,是否設置成功。
$sessionpath = session_save_path();
if (strpos ($sessionpath, ";") !== FALSE)
$sessionpath = substr ($sessionpath, strpos ($sessionpath, ";")+1);
//獲取當前session的保存路徑
echo $sessionpath;
如果服務器是遠程連接的,不在本地,不方便更改php配置文件,可以再程序中重置session目錄。
session_save_path('E:/ttt');
9.大多數(shù)據(jù)情況下我們對于session過期時間使用的是默認設置的時間,而對于一些有特殊要求的情況下我們可以設置一下session過期時間。
對此,可以在PHP中,設置php.ini,找到session.gc_maxlifetime = 1440 #(PHP5默認24分鐘)
系統(tǒng)默認:
session.gc_probability = 1
session.gc_divisor = 1000
garbage collection 有個概率的,1/1000就是session 1000次才有一次被回收。
只要你的訪問量大了,那就能達到回收的效果.
或者你也可以設置一下session.gc_divisor 的值,
比如:session.gc_divisor = 1,這樣就能明顯的看到SESSION過期的效果了.
我們最常用的是在php程序中設置,如下例程序所示:
<?php
if(!isset($_SESSION['last_access'])||(time()-$_SESSION['last_access'])>60)
$_SESSION['last_access'] = time();
?>
session有過期的機制:
session.gc_maxlifetime 表示session 過期是一個小概率的事件,分別使用session.gc_probability和session.gc_divisor 來確定運行session 中gc 的概率 session.gc_probability和session.gc_divisor的默認值分別為 1和100。分別為分子和分母 所以session中gc的概率運行機會為1% 。如果修改這兩個值,則會降低php的效率。所以這種方法是不對的?。?br>
因此,修改php.ini文件中的gc_maxlifetime變量就可以延長session的過期時間了:(例如,我們把過期時間修改為86400秒)
session.gc_maxlifetime = 86400
然后,重啟你的web服務就可以了。
session“回收”何時發(fā)生:
默認情況下,每一次php請求,就會有1/100的概率發(fā)生回收,所以可能簡單的理解為“每100次php請求就有一次回收發(fā)生”。這個概率是通過以下參數(shù)控制的
概率是gc_probability/gc_divisor
session.gc_probability = 1
session.gc_divisor = 100
PHP中的session永不過期
不修改程序是最好的方法了,因為如果修改程序,測試部一定非常郁悶,那么只能修改系統(tǒng)環(huán)境配置,其實很簡單,打開php.ini設置文件,修改三行如下:
1、session.use_cookies
把這個的值設置為1,利用cookie來傳遞sessionid
2、session.cookie_lifetime
這個代表SessionID在客戶端Cookie儲存的時間,默認是0,代表瀏覽器一關閉SessionID就作廢……就是因為這個所以PHP的 session不能永久使用! 那么我們把它設置為一個我們認為很大的數(shù)字吧,999999999怎么樣,可以的!就這樣。
3、session.gc_maxlifetime
這個是Session數(shù)據(jù)在服務器端儲存的時間,如果超過這個時間,那么Session數(shù)據(jù)就自動刪除! 那么我們也把它設置為99999999。
就這樣一切ok了,當然你不相信的話就測試一下看看——設置一個session值過個10天半個月的回來看看,如果你的電腦沒有斷電或者宕機,你仍然可以看見這個sessionid。
當然也可能你沒有控制服務器的權限并不能像我一樣幸運的可以修改php.ini設置,一切依靠我們自己也是有辦法的,當然就必須利用到客戶端存儲 cookie了,把得到的sessionID存儲到客戶端的cookie里面,設置這個cookie的值,然后把這個值傳遞給session_id()這個函數(shù),具體做法如下:
<?php
session_start(); // 啟動Session
$_SESSION['count']; // 注冊Session變量Count
isset($PHPSESSID)?session_id($PHPSESSID):$PHPSESSID = session_id();
// 如果設置了$PHPSESSID,就將SessionID賦值為$PHPSESSID,否則生成SessionID
$_SESSION['count']++; // 變量count加1
setcookie('PHPSESSID', $PHPSESSID, time()+3156000); // 儲存SessionID到Cookie中
echo $count; // 顯示Session變量count的值
?>
10.session_destroy()銷毀一個會話中的全部數(shù)據(jù),除了把服務器端的session清除,也要把瀏覽器的cookie清除
<?php
// 初始化會話。
// 如果要使用會話,別忘了現(xiàn)在就調(diào)用:
session_start();
// 重置會話中的所有變量
$_SESSION = array();
// 如果要清理的更徹底,那么同時刪除會話 cookie
// 注意:這樣不但銷毀了會話中的數(shù)據(jù),還同時銷毀了會話本身
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(),"", -1,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
// 最后,銷毀會話
session_destroy();