1. 程式人生 > >第118講 session② 獲取session 更新session 刪除session session細節和原理深入

第118講 session② 獲取session 更新session 刪除session session細節和原理深入

注意所有取session之前都要判斷是否為null

<?php
	header("content-type:text/html;charset=utf-8");
	echo "<br/>***如何獲取session資料***<br/>";
	//初始化session
	session_start();
	//獲取session
	//1、把所有的session獲取出來
	echo "<pre>";
	print_r($_SESSION);
	echo "</pre>";
	//2、通過鍵指定獲取某個值
	echo "儲存的名字是".$_SESSION['name'];
	echo "<br/>陣列的資料是:";
	$arr1 = $_SESSION['arr1'];
	for ($i = 0; $i < count($arr1); $i++) {
		echo "<br/>-----".$arr1[$i];
	}
	echo "<br/>";
	//取出物件
	echo "<br/>取出物件";
	$dog = $_SESSION['dog'];
	
	echo "狗:".$dog->dogname;

如上方式取物件 物件取出位置報錯

取出物件
Notice: main(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "Dog" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition in D:\phpStudy\WWW\SessionTest\session2.php on line 23
狗:
<?php
    require_once 'Pet.php';
	header("content-type:text/html;charset=utf-8");
	echo "<br/>***如何獲取session資料***<br/>";
	//初始化session
	session_start();
	//獲取session
	//1、把所有的session獲取出來
	echo "<pre>";
	print_r($_SESSION);
	echo "</pre>";
	//2、通過鍵指定獲取某個值
	echo "儲存的名字是".$_SESSION['name'];
	echo "<br/>陣列的資料是:";
	$arr1 = $_SESSION['arr1'];
	for ($i = 0; $i < count($arr1); $i++) {
		echo "<br/>-----".$arr1[$i];
	}
	echo "<br/>";
	//取出物件
	//取出物件前先重新宣告一下物件就不會報下邊那個錯了 可以把類重新寫一遍
	/**
	 * 取出物件
	Notice: main(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "Dog" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition in D:\phpStudy\WWW\SessionTest\session2.php on line 23
	狗:
	 * Enter description here ...
	 * @author Administrator
	 *
	 */
	class  Dog{
		public $dogname;
		public $sex;
	}
	echo "<br/>取出物件";
	$dog = $_SESSION['dog'];
	
	echo "狗:".$dog->dogname;
	
	echo "<br/>取出pet物件<br/>";
	$pet = $_SESSION['pet'];
	echo "取出的pet物件".$pet->petName;

如上取物件的時候引入宣告也是可以的 如上邊的pet物件

更新session資料:

<?php
	header("content-type:text/html;charset=utf-8");
	echo "<br/>***演示更新session資料***<br/>";
	session_start();//初始化session;
	$_SESSION['name']="12345678dd";//如此這般按照對應的鍵重新儲存一下就直接重新整理了

	echo "重新整理成功!";

刪除session資料

<?php
	header("content-type:text/html;charset=utf-8");
	echo "<br/>***演示刪除session資料***<br/>";
	session_start();//初始化session
	//1、刪除某一個鍵值對key<==>val
	unset($_SESSION['name']);
	//2、刪除所有鍵值對
	
	
	session_destroy();//刪除當前瀏覽器對應的session檔案----不會刪除別人瀏覽這個介面的session(只刪除自己開啟瀏覽器的session)
	echo "刪除session成功";

image

一個瀏覽器對應一個session 本機 假如開了三個瀏覽器程序,那麼三個瀏覽器程序對應這三個session檔案

測試:

  • 本機 一個google瀏覽器 一個 ie 瀏覽器 一個 360瀏覽器(可以一個瀏覽器開三個程序 我電腦剛好有三個瀏覽器直接開啟測試了)
    全都執行都可以看到session
    依次開啟瀏覽器開啟對應的url依次生成對應瀏覽器程序的session檔案

相應的清除session就得用對應的瀏覽器程序清除
不過貌似session有預設儲存時間限制到時間自動清理(沒試過)

如下圖:
image

小結:

  • 1、如果需要使用session,必須要初始化
    即session_start();
  • 2、session檔案中可以放入多個鍵值對,注意,鍵不能重複
  • 3、如果我們要取出物件,則事先宣告下就好 如上pet

session 的細節討論

  • ①session 檔案預設存放時間是1400s,這個時間可以通過php.ini來修改 ,如下值是可以修改的
session.gc_maxlifetime = 1440

如上時間指的是在1440s內沒有使用過session檔案,如此該session檔案才會被當做垃圾進行回收

  • ②session檔案的存放路徑是可以修改的,一樣在php.ini中

如下

;session.save_path = "/tmp"
session.save_path = "D:\phpStudy\tmp"

在php手冊中php.ini所有配置資訊位置

image
所有配置更新後都要重新啟動Apache。

image

session基本使用圖解
image

image

image

相同內容不同檔案 同一瀏覽器訪問的話。會生成一個統一的
Cookie:PHPSESSID=urskaqg254e51riu9tmv7f66g1
然後會看到

http://localhost//SessionTest/session1.php

http://localhost//SessionTest/sessionHttp.php
這倆 不同檔案在同一個瀏覽器中
PHPSESSID=urskaqg254e51riu9tmv7f66g1 是一模一樣的

http://localhost//SessionTest/session1.php

Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection:Keep-Alive
Content-Type:text/html;charset=utf-8
Date:Tue, 18 Jul 2017 03:21:45 GMT
Expires:Thu, 19 Nov 1981 08:52:00 GMT
Keep-Alive:timeout=5, max=100
Pragma:no-cache
Server:Apache/2.4.10 (Win32) OpenSSL/0.9.8zb mod_fcgid/2.3.9
Set-Cookie:PHPSESSID=urskaqg254e51riu9tmv7f66g1; path=/
Transfer-Encoding:chunked
X-Powered-By:PHP/5.4.33

http://localhost//SessionTest/sessionHttp.php

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch, br
Accept-Language:zh-CN,zh;q=0.8,en;q=0.6
Cache-Control:max-age=0
Connection:keep-alive
Cookie:PHPSESSID=urskaqg254e51riu9tmv7f66g1
Host:localhost
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36

所以基於此 不同檔案相同內容 相同瀏覽器程序生成的session_id是一樣的。這就好解釋為什麼瀏覽器能精準找到這個session檔案是因為啥了。。id號相同啊。