php會(huì)話控制
創(chuàng)新互聯(lián)致力于互聯(lián)網(wǎng)網(wǎng)站建設(shè)與網(wǎng)站營(yíng)銷,提供做網(wǎng)站、網(wǎng)站建設(shè)、網(wǎng)站開發(fā)、seo優(yōu)化、網(wǎng)站排名、互聯(lián)網(wǎng)營(yíng)銷、微信小程序、公眾號(hào)商城、等建站開發(fā),創(chuàng)新互聯(lián)網(wǎng)站建設(shè)策劃專家,為不同類型的客戶提供良好的互聯(lián)網(wǎng)應(yīng)用定制解決方案,幫助客戶在新的全球化互聯(lián)網(wǎng)環(huán)境中保持優(yōu)勢(shì)。
一、cookie
1、會(huì)話控制之Cookie概述
cookie是在http協(xié)議下,服務(wù)器或腳本可以維護(hù)客戶端信息的一種方式。
Cookie是一種由服務(wù)器發(fā)送給客戶端的片段信息,存儲(chǔ)在客戶端瀏覽器的內(nèi)存或者硬盤上。常用于保存用戶名,密碼,個(gè)性化設(shè)置,個(gè)人偏好記錄等。當(dāng)用戶訪問服務(wù)器時(shí),服務(wù)器可以設(shè)置和訪問cookie的信息。
cookie保存在客戶端,通常是IE或Firefox瀏覽器的cookie臨時(shí)文件夾中,可以手動(dòng)刪除。注意:如果瀏覽器上cookie太多,超過了系統(tǒng)所允許范圍,瀏覽器也會(huì)自動(dòng)對(duì)它進(jìn)行刪除
2、Cookie的操作
設(shè)置Cookie
語(yǔ)法:bool setcookie(string name,[string value,[intexpire,[string path,[stringdomain,[intsecure]]]]]);本cookie函數(shù)可以有6個(gè)屬性,常用的有3個(gè)參數(shù)。
//向客戶端發(fā)送一個(gè)Cookie,將變量username值為skygao,保存客戶端一周的時(shí)間
setcookie("username","skygao", time()+60*60*24*7);
//使用setCookie()函數(shù)的全部參數(shù)設(shè)置
setcookie("username","skygao", time()+60*60*24*7, "/test",".example.com", 1);
setcookie參數(shù)解釋
參數(shù)描述示例
name 名字調(diào)用名為cookiename的cookie
value 值假設(shè)第一個(gè)參為cookiename,通過$_COOKIE[‘name’取得值]
exprice 有效時(shí)間設(shè)置cookie的過期時(shí)間和日期,用一個(gè)標(biāo)準(zhǔn)的Unix時(shí)間標(biāo)記,可以用time()函數(shù)取得,以秒為單位.
path 范圍服務(wù)器端的有效路徑,設(shè)置為“/”表示這個(gè)域中所有數(shù)組都可以被訪問讀取。
domain 域名設(shè)定cookie有效域名
secure 指明cookie只能通過安全的
https傳送設(shè)為true時(shí)只能使用安全的https,默認(rèn)為false,即設(shè)置是否僅在https安全連接時(shí)才發(fā)送cookie到客戶端,0或1。
讀取Cookie
如果Cookie設(shè)置成功,客戶端就擁有了Cookie文件,用來(lái)保存Web服務(wù)器為其設(shè)置的用戶信息。
在PHP中讀取Cookie信息很簡(jiǎn)單,使用超全局?jǐn)?shù)組
$_COOKIE[‘cookie名’]即可獲取cookie中的內(nèi)容。
//輸出Cookie中保存的所有用戶信息
print_r($_COOKIE);
3、Cookie的數(shù)組形態(tài)應(yīng)用
數(shù)組也可以利用多維數(shù)組的形式,將多個(gè)內(nèi)容值存儲(chǔ)在相同Cookie名稱標(biāo)識(shí)符下。
setcookie("user[username]","skygao"); //$_COOKIE["user"]["username"]
setcookie("user[password]",md5("123456")); //$_COOKIE["user"]["password"]
setcookie("user[email]","skyga@lampbrother.net");//$_COOKIE["user"]["email"]
//遍歷$_COOKIE[“user”]數(shù)組
foreach($_COOKIE["user"]as $key => $value){
//輸出Cookie數(shù)組中二維的鍵值對(duì)
echo$key.":".$value."\n";
}
4、刪除Cookie
有2種方式刪除Cookie
–1.省略setcookie()函數(shù)的所有參數(shù)列
–2.設(shè)置cookie為已過期
//只指定Cookie識(shí)別名稱一個(gè)參數(shù),即刪除客戶端中這個(gè)指定名稱的Cookie資料
setCookie("account"); //第一種方法
//設(shè)置Cookie 在當(dāng)前時(shí)間過期,因此系統(tǒng)會(huì)自動(dòng)刪除識(shí)別名稱為isLogin的Cookie
setCookie("isLogin", "", time()-1); //第二種方法
二、session
1、會(huì)話控制session的工作機(jī)制
Session和Cookie相似,都是用來(lái)儲(chǔ)存使用者的相關(guān)資料。但最大的不同之處在于Cookie是將數(shù)據(jù)存放在客戶端的計(jì)算機(jī)之中,而Session則是將數(shù)據(jù)存放于服務(wù)器系統(tǒng)之下。
cookie和session在php中的使用區(qū)別:
– cookie和session都可以暫時(shí)保存在多個(gè)頁(yè)面中使用的變量,但是它們有本質(zhì)的差別。
cookie存放在客戶端瀏覽器中,
session保存在服務(wù)器上。
–它們之間的聯(lián)系是session ID一般保存在cookie中,或者放在URL上。
禁用cookie的方法:
–點(diǎn)擊IE中的“工具”—“Internet選項(xiàng)”,在彈出的對(duì)話框里點(diǎn)擊“安全”—“自定義級(jí)別”項(xiàng),將“允許每個(gè)對(duì)話COOKIE”設(shè)為禁用.
2、session的應(yīng)用
Session的聲明與使用
Session的設(shè)置不同于Cookie,必須先啟動(dòng),在PHP中必須調(diào)用session_start()。
session_start()函數(shù)的語(yǔ)法格式如下
– Bool session_start(void)
–注意:session_start()函數(shù)之前不能有任何輸出
Session以數(shù)組的形式使用
–如:$_SESSION[‘session名’]
session_start(); //啟動(dòng)Session的初始化
$_SESSION["username"]= "skygao"; //注冊(cè)Session變量,賦值為一用戶名稱
$_SESSION["uid"]= 1; //注冊(cè)Session變量,賦值為一個(gè)用戶的ID
注冊(cè)一個(gè)會(huì)話變量和讀取Session
在PHP中使用Session變量,除了要啟動(dòng)之外,還要經(jīng)過注冊(cè)的過程。注冊(cè)和讀取Session變量,都要通過訪問$_SESSION數(shù)組完成。
在$_SESSION關(guān)聯(lián)數(shù)組中的鍵名具有和PHP中普通變量相同的命名規(guī)則。
Session變量會(huì)被保存在服務(wù)器端的某個(gè)文件中,該文件的位置是通過php.ini文件,在session.save_path屬性指定的目錄下。
注銷變量與銷毀Session
1.bool session_destroy(void)
–刪除服務(wù)器端保留session信息的文件
2.unset($_SESSION[‘鍵名’])
–刪除內(nèi)存中由Session數(shù)組保存的變量
–清除所有變量可以使用 $_SESSION=array()
3.如果session是基于Cookie的,那么我們還需要?jiǎng)h除客戶端保留的cookie文件
代碼1:
//開啟會(huì)話session(cookie不用)
//session_start()前面不能有任何輸出, 這個(gè)函數(shù)向客戶端發(fā)一個(gè)session_id保存在cookie中
//還在服務(wù)器中創(chuàng)建一個(gè)和保存在客戶端同名的session文件(文本)
session_start();
//使用$_SESSION這個(gè)數(shù)組
$_SESSION['username']="jons";
$_SESSION['age']=18;
$_SESSION['sex']="nv";
$_SESSION['lx']['email']="mz@aaa.com";
$_SESSION['lx']['phone']='119';
echo $_SESSION['username'];
代碼2:
//開啟session
// 1.判斷客戶端是否有了sessionid 變量名為PHPSESSID,直接使用這個(gè)session id開啟會(huì)話
//也不新創(chuàng)建文件了,直接找這個(gè)同名session id的session文件
session_start();
echo '
';
print_r($_SESSION);
echo '
';
echo '
';
echo $_SESSION['username'];
代碼3:
//1開啟會(huì)話session 1
session_start();
//多余的
$username= $_SESSION['username'];
//unset($_SESSION['username']);
//2就可以刪除數(shù)組中的所有內(nèi)容, 即session對(duì)應(yīng)的這個(gè)用戶文件的內(nèi)容就空了
$_SESSION= array();
//刪除客戶中cookie聽sessionid
if(isset($_COOKIE[session_name()])){
setCookie(session_name(),"", time()-3600, "/");
}
//4銷毀session
session_destroy();
echo"再見:{$username}";
3、Session的配置選項(xiàng)
配置Session
php.ini文件和Session有關(guān)的幾個(gè)常用配置選項(xiàng)
– session.auto_start = 0 ; 在請(qǐng)求啟動(dòng)時(shí)初始化session
– session.cache_expire= 180; 設(shè)置緩存中的會(huì)話文檔在 n 分鐘后過時(shí)
– session.cookie_lifetime = 0 ;設(shè)置按秒記的cookie的保存時(shí)間,
相當(dāng)于設(shè)置Session的過期時(shí)間,為0時(shí)表示直到瀏覽器被重啟
– session.auto_start=1,這樣就無(wú)需每次使用session之前都要調(diào)用session_start()。但啟用該選項(xiàng)也有一些限制,如果確實(shí)啟用了 session.auto_start,則不能將對(duì)象放入會(huì)話中,因?yàn)轭惗x必須在啟動(dòng)會(huì)話之前加載以在會(huì)話中重建對(duì)象。
–session.cookie_path = / ; cookie的有效路徑
–session.cookie_domain =; cookie的有效域
– session.name =PHPSESSID;用在cookie里的session的名字
–session.save_handler = files ;用于保存/取回?cái)?shù)據(jù)的控制方式
– session.save_path= /tmp;在 save_handler設(shè)為文件時(shí)傳給控制器的參數(shù),這是數(shù)據(jù)文件將保存的路徑.
–session.use_cookies = 1;是否使用cookies
4、Session的自動(dòng)垃圾回收機(jī)制
php.ini中相關(guān)的配置
– session.cookie_lifetime=0;關(guān)閉瀏覽器相應(yīng)的cookie文件即被刪除
– session.gc_maxlifetime=1440;設(shè)置過期session時(shí)間,默認(rèn)1440秒(24分鐘)
–session.gc_probability/session.gc_divisor;啟動(dòng)垃圾回收機(jī)制的概率(建議值為1/1000~5000)
代碼:
//開啟會(huì)話session(cookie不用)
//session_start()前面不能有任何輸出, 這個(gè)函數(shù)向客戶端發(fā)一個(gè)session_id保存在cookie中
// 還在服務(wù)器中創(chuàng)建一個(gè)和保存在客戶端同名的session文件(文本)
// 調(diào)度PHP的機(jī)制使用session
session_start();
//使用$_SESSION這個(gè)數(shù)組
$_SESSION['username']="jons";
$_SESSION['age']=18;
$_SESSION['sex']="nv";
$_SESSION['aaaaaaaa']="bbbbbbbbbbbbbbb";
$_SESSION['lx']['email']="mz@aaa.com";
$_SESSION['lx']['phone']='119';
echosession_name()." = ".session_id()."
";
5、基于URL傳遞session的id
為啥要使用URL傳session id
基于cookie的方式傳遞session id這種方式更優(yōu)。
但不總是可用,因?yàn)橛脩粼诳蛻舳丝梢云帘蝐okie;
什么是基于url傳session id
是通過url參數(shù)進(jìn)行傳遞
直接將session id嵌入到url中去
參數(shù)規(guī)則
Session_name()和session_id()應(yīng)用
常量SID的使用
URL加session id也是自動(dòng)的
在使用Linux系統(tǒng)做服務(wù)器時(shí),在編輯PHP時(shí),打開—enable-trans-sid配置選項(xiàng),和運(yùn)行時(shí)選項(xiàng)session.use_trans_sid=1激活,在客戶端禁用cookie時(shí),相對(duì)的url將被自動(dòng)修改為包含sessionid,如果沒有配置,或使用windows系統(tǒng)作為服務(wù)器時(shí),可以使用常量SID.
建議使用Linux并配置好