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