PHP會話機制---session的基本使用
1,思考:登錄網站后,在每個網頁都能拿到用戶信息
(1) 使用超鏈接傳遞用戶名,這樣太繁瑣了,不建議使用 。
(2) 使用數據庫,每打開一個頁面都查詢一次用戶信息表,這樣網頁加載速度變慢,用戶體驗變差。
(3) 使用cookie,登錄成功后,服務器將用戶信息存儲到客戶端的cookie。這樣存在缺點:
① 安全性差,將用戶信息存儲在本地,很容易被別人找到。
② 服務器每次打開一個網頁,都通過網絡從客戶機讀取用戶信息,這樣浪費帶寬,當用戶很多,每個用戶打開很多網頁,會浪費巨大的帶寬。
(4) 解決之道:session
2,session技術
Session是服務器端技術,利用這個技術,服務器可以為每個用戶的瀏覽器創建一個為其獨享的session文件,由於session為用戶瀏覽器獨享,所以用戶在訪問服務器的web資源時,可以把各自的數據放在各自的session中,當用戶再去訪問服務器中的其他web資源時,其他web資源再從用戶各自的session中取出數據為用戶服務。
3,保存session信息
index1.php
1
2
3
|
<?php
session_start();
// 初始化session
$_SESSION
[
'name'
] =
"zhangsan"
;
//保存某個session信息
|
index2.php
1
2
3
|
<?php
session_start();
echo
$_SESSION
[
'name'
];
|
先在網頁中運行index1.php,再運行index2.php頁面輸出:
4,session可以保存多種數據類型
session不但保存字符串,還可以保存整型,布爾型,數組,對象等。
index1.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
<?php
session_start();
// 初始化session
$_SESSION
[
'name'
] =
"zhangsan"
;
//保存某個session信息
$_SESSION
[
'age'
] = 100;
$_SESSION
[
'isBoy'
] = true;
$arr1
=
array
(
"北京"
,
"小明"
,
"hello"
);
$_SESSION
[
'arr1'
] =
$arr1
;
class
Dog{
private
$name
;
private
$age
;
private
$intro
;
function
__construct(
$name
,
$age
,
$intro
){
$this
->name =
$name
;
$this
->age =
$age
;
$this
->intro =
$intro
;
}
}
$dog1
=
new
Dog(
"大黃"
,2,
"很聽話"
);
$_SESSION
[
'dog1'
] =
$dog1
;
|
index2.php
1
2
3
4
5
6
7
|
<?php
session_start();
foreach
(
$_SESSION
as
$key
=>
$value
){
echo
$key
.
":"
;
var_dump(
$value
);
echo
"<br/>"
;
}
|
先在網頁中運行index1.php,再運行index2.php頁面輸出:
5,獲取session信息
(1)直接獲取所有session
(2)根據key獲取
a)直接獲取某個變量
b)獲取數組
c)獲取對象,session在保存對象時候,沒法保存類的信息,因此在獲取對象,需要先聲明這個類。可以把類單獨作為一個文件,存儲和讀取session時候分別引用這個文件。
6,Session的更新,就是根據key值重新保存session的值。
7, Session的刪除
(1) 指定刪除session中某個鍵值對
(2) 刪除所有session
8,Session數據默認存在時間是1440s(24分鍾),可以在php.ini中修改, session.gc_maxlifetime = 1440。Session文件的存放路徑是可以修改的,可以通過修改php.ini改變sesion文件存放路徑,session.save_path = "tcp://127.0.0.1:11211"。
9,Session使用前,先進行初始化,session_start();這樣比較麻煩,可以在php.ini設置session自動初始化,session.auto_start = 0(此方法不推薦)。
10,瀏覽器訪問頁面a.php時候,服務器產生一個session文件,將其存放在服務器,同時將session_id發送給瀏覽器,瀏覽器將其保存到cookie,瀏覽器再次訪問b.php時候,從cookie中獲取session_id發送到服務器,服務器根據session_id獲取相應session內容。
問題:如果瀏覽器禁用cookie,怎么使用session呢?
使用URL重寫的方式,url重寫分為手動和自動。自動重寫url就是配置php.ini,開啟透明的SID,其他程序不變,自動重寫url不安全,不建議使用。
開啟透明SID,需要修改的php.ini是:
session.use_trans_sid = 1 //由0改為1
session.use_only_cookies = 0 //是否只使用cookie來保存session值 該參數為1時,上述機制失效。
session.use_cookies = 0 //設置客戶端是否使用cookie來保存session值 該參數的值不影響上述機制的進行。這個可改可不改
手動模式:
index1.php
1
2
3
4
5
6
|
<?php
session_start();
$_SESSION
[
'name'
] =
"zhangsan"
;
$_SESSION
[
'age'
] = 100;
echo
'session save succes! click <a href="index2.php?'
.SID.
'">here</a> to see SID<br/>'
;
|
index2.php
1
2
3
4
5
6
7
|
<?php
if
(
$_GET
[
"PHPSESSID"
]){
session_id(
$_GET
[
"PHPSESSID"
]);
}
session_start();
echo
session_id().
'<br/>'
;
echo
$_SESSION
[
'name'
];
|
而自動模式,會將url后面自動添加PHPSESSID參數,所以在index1.php中去掉SID即可,index2.php不變。
index1.php
1
2
3
4
5
6
|
<?php
session_start();
$_SESSION
[
'name'
] =
"zhangsan"
;
$_SESSION
[
'age'
] = 100;
echo
'session save succes! click <a href="index2.php">here</a> to see SID<br/>'
;
|
11,php.ini中關於session和cookie的配置
(1) session.use_trans_sid = 0,開啟后,默認為每個url后添加了session_name=session_id。
(2) session.save_path=”c:/mysession”,save_path是session文件在服務器的存放路徑。
(3) session.gc_maxlifetime = 1440,session默認最大生命周期,當session文件在1440s后沒被訪問的話,則該session被視為“垃圾文件”,並且等待gc(垃圾回收)進程的調用時候被清理掉;session.gc_probability=1;session.gc_divisor=1000;這兩個參數根據網站規模合理設置。每當初始化一個session時候,有gc_probability/gc_divisor的概率執行一次垃圾回收。
我開啟三個會話,則創建三個對應的session文件,當每個文件在30秒內都沒被調用的話,就會被當成是“垃圾文件”,等到gc進程調用的時候,“垃圾文件”就會被unlink,因為之前我已經通過修改php.ini配置文件,將gc被調用的概率改成百分百,所以接下來,如果我重新使用任何一個瀏覽器刷新下頁面的時候,三個session文件,應該只剩下一個了。
(4) session.cookie_lifetime,以秒數指定了發送到瀏覽器的cookie的生命周期,值為0表示“直到關閉瀏覽器”。默認為0。這個與程序中setCookie(“name”,”zhangsan”,time()+60);類似。