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

1,思考:登陸網站後,在每一個網頁都能拿到用戶信息php

(1) 使用超連接傳遞用戶名,這樣太繁瑣了,不建議使用 。web

(2) 使用數據庫,每打開一個頁面都查詢一次用戶信息表,這樣網頁加載速度變慢,用戶體驗變差。數據庫

(3) 使用cookie,登陸成功後,服務器將用戶信息存儲到客戶端的cookie。這樣存在缺點:數組

      ① 安全性差,將用戶信息存儲在本地,很容易被別人找到。 瀏覽器

      ② 服務器每次打開一個網頁,都經過網絡從客戶機讀取用戶信息,這樣浪費帶寬,當用戶不少,每一個用戶打開不少網頁,會浪費巨大的帶寬。安全

(4) 解決之道:session服務器

2,session技術cookie

      Session是服務器端技術,利用這個技術,服務器能夠爲每一個用戶的瀏覽器建立一個爲其獨享的session文件,因爲session爲用戶瀏覽器獨享,因此用戶在訪問服務器的web資源時,能夠把各自的數據放在各自的session中,當用戶再去訪問服務器中的其餘web資源時,其餘web資源再從用戶各自的session中取出數據爲用戶服務。 網絡

3,保存session信息session

index1.php

<?php
session_start(); // 初始化session
$_SESSION['name'] = "zhangsan"; //保存某個session信息

index2.php

<?php
session_start();
echo $_SESSION['name'];

  先在網頁中運行index1.php,再運行index2.php頁面輸出:

 

4,session能夠保存多種數據類型

session不但保存字符串,還能夠保存整型,布爾型,數組,對象等。

index1.php

<?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

<?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

<?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

<?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

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

相關文章
相關標籤/搜索