PHP會話機制---session的基本使用


 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);類似。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM