php url传递参数_互联网系统(APP、网站等)通信基石——会话(PHP版)
一、會話概述
1.1、技術背景
互聯網通信中采用的Http協議(建立TCP連接->Http請求->Http應答->斷開TCP連接)本身是無狀態的,即Http各請求之間是相互獨立、互不相關的,而大量應用需要將各請求關聯起來(如:用戶登錄系統購物、多次購買行為需要與該用戶綁定),因此需要有一種機制實現Http各請求之間的關聯
1.2、會話定義
用戶端與服務端進行網絡通信,用戶從登錄進入系統到注銷退出系統,這一完整過程稱為會話(Session);會話中,用戶端與服務端進行的一序列通信處理(Http請求與應答)將始終與登錄的具體用戶相關聯
1.3、實現原理
服務端收到用戶端Http請求后,先從Http請求包中獲取會話ID(如果沒有,將自動生成一個會話ID),根據會話ID在內存中生成對應的散列表(如:PHP中的$_SESSION[])、檢索上次保存的會話記錄(如果檢索不到,將自動生成一條與該會話ID綁定的空會話記錄),將會話記錄中的數據加載到散列表,通過散列表讀寫當前會話數據,最后請求處理結束時將散列表中的會話數據保存為會話記錄、腳本結束時將當前的會話ID放入Http應答包發送給用戶端(供下次Http請求使用)
二、會話ID的傳遞
從上述會話實現原理可知,會話ID將一序列Http數據包(請求/應答)關聯起來,從而構成一個完整的會話,整個會話過程中需要在用戶端與服務端通過Http數據包傳遞會話ID,具體傳遞方式有:Cookie方式傳遞、URL參數方式傳遞、數據內容方式傳遞,具體如下
2.1、Cookie方式傳遞
2.1.1、傳遞原理
Http請求過程:
用戶端(如:瀏覽器)先從本地(內存或磁盤)讀取保存的對應Cookie數據(名稱、值、域名等),再將讀取到的相應數據填寫到Http請求數據包頭的Cookie字段(首次請求時,由于本地無Cookie數據,該字段為空),而后將Http請求數據包發送到服務端;服務端收到Http請求數據包后解析時,將根據當前的會話名稱匹配對應的Cookie名稱,如果匹配到了、則讀取對應的值(會話ID)作為當前的會話ID,如果匹配不到、將自動生成一個當前的會話ID;該過程中,用戶端從本地讀取保存的Cookie原則為:Cookie所聲明的作用范圍(由其路徑與域共同決定)大于等于將要請求的資源所在的位置
Http應答過程:
服務端先將當前的會話名稱、會話ID等數據分別填入Http應答數據包頭的Cookie字段,而后將Http應答數據包發送到用戶端;用戶端收到Http應答數據包進行解析,再將解析得到的Cookie數據(名稱、值、域名等)進行保存(至于保存到內存還是磁盤,由具體的程序設計決定,一般原則為:如果Cookie設置了有效時間,就保存到磁盤,否則將保存到內存)
2.1.2、環境配置
用戶端配置:
使用Cookie方式傳遞時,用戶端必須開啟Cookie的接受與發送功能,否則將不能實現該傳遞功能;不同用戶端開啟的方法不一樣,以下為IE瀏覽器開啟Cookie接受與發送功能的相關步驟:
菜單欄“工具”->“Internet選項”->“隱私”->“選擇Internet區域設置”->選擇“接受所有Cookie”->點“確定”關閉
服務端配置:
使用Cookie方式傳遞時,服務端必須開啟Cookie的接受與發送功能(一般默認為開啟狀態),否則將不能實現該傳遞功能;開啟方法如下:
方法1:配置文件“php.ini”中的“session.use_cookies”配置項設置為“1”->重新啟動服務器(如:Apache)
方法2:用ini_set()函數直接在PHP腳本中將“session.use_cookies”配置項設置為“1”
2.1.3、案例演示
創建如下PHP腳本文件(ByCookie.php):
/*
* ByCookie.php
*/
//打開錯誤及告警提示(不打開E_NOTICE,否則下面使用$_SESSION會有告警)
error_reporting((E_ALL | E_STRICT) & (~E_NOTICE));
//error_reporting(E_ALL | E_STRICT);
//設置會話名稱
session_name('TransID');
//啟動新會話或者重用現有會話
$startRst = session_start();
if (!$startRst)
{
echo 'Session start fail!'.'
';
return ;
}
//獲取當前會話名稱
$sessName = session_name();
echo 'session name:'.$sessName.'
';
//獲取當前會話ID
$sessId = session_id();
echo 'session id:'.$sessId.'
';
//讀寫當前會話數據
echo 'Last request,session data:'.$_SESSION['count'].'
';
if (empty($_SESSION['count']))
{
$_SESSION['count'] = 1;
}
else
{
$_SESSION['count']++;
}
echo 'This request,session data:'.$_SESSION['count'].'
';
?>
在瀏覽器中用多個頁面順序打開上述“ByCookie.php”文件多次,便可以看到被多次傳遞的同一個會話ID及相關數據,結果如下:
2.2、URL參數方式傳遞
2.2.1、傳遞原理
首次請求時,服務端將當前的會話名稱及會話ID放入Http應答數據包響應正文(作為參數附加到URL后)中發送到用戶端;用戶端通過URL觸發連接請求(如:點擊鏈接或提交表單)時,會話名稱及會話ID被填寫到Http請求數據包頭的URL字段(作為參數附加到URL后),而后將Http請求數據包發送到服務端;服務端收到Http請求數據包后,通過$_GET[]全局變量即可得到請求數據包頭URL字段中的參數(會話名稱及會話ID);如果還有需要,服務端再將會話名稱及會話ID放入Http應答數據包響應正文(作為參數附加到URL后)中發送到用戶端、供用戶端再次通過URL觸發連接請求
2.2.2、案例演示
在同一目錄下創建如下2個PHP腳本文件(ByURLSend.php及ByURLRcve.php):
文件1(ByURLSend.php):
/*
* ByURLSend.php
*/
//打開錯誤及告警提示(不打開E_NOTICE,否則下面使用$_SESSION會有告警)
error_reporting((E_ALL | E_STRICT) & (~E_NOTICE));
//error_reporting(E_ALL | E_STRICT);
//設置會話名稱
session_name('TransID');
//啟動新會話或者重用現有會話
$startRst = session_start();
if (!$startRst)
{
echo 'Session start fail!'.'
';
return ;
}
//獲取當前會話名稱
$sessName = session_name();
echo 'session name:'.$sessName.'
';
//獲取當前會話ID
$sessId = session_id();
echo 'session id:'.$sessId.'
';
//讀寫當前會話數據
echo 'Last request,session data:'.$_SESSION['count'].'
';
if (empty($_SESSION['count']))
{
$_SESSION['count'] = 1;
}
else
{
$_SESSION['count']++;
}
echo 'This request,session data:'.$_SESSION['count'].'
';
?>
==session_id();?>">URL參數方式傳遞(方法1)
">URL參數方式傳遞(方法3)
文件2(ByURLRcve.php):
/*
* ByURLRcve.php
*/
//打開錯誤及告警提示(不打開E_NOTICE,否則下面使用$_SESSION會有告警)
error_reporting((E_ALL | E_STRICT) & (~E_NOTICE));
//error_reporting(E_ALL | E_STRICT);
//設置會話名稱
session_name('TransID');
//獲取當前會話名稱
$sessName = session_name();
//獲取當前會話ID
$sessId = $_GET[$sessName];
if ('' == $sessId)
{
echo 'Session id transmits fail!'.'
';
return ;
}
//設置當前會話ID
session_id($sessId);
//啟動新會話或者重用現有會話
$startRst = session_start();
if (!$startRst)
{
echo 'Session start fail!'.'
';
return ;
}
//獲取當前會話名稱
$sessName = session_name();
echo 'session name:'.$sessName.'
';
//獲取當前會話ID
$sessId = session_id();
echo 'session id:'.$sessId.'
';
//讀寫當前會話數據
echo 'Last request,session data:'.$_SESSION['count'].'
';
if (empty($_SESSION['count']))
{
$_SESSION['count'] = 1;
}
else
{
$_SESSION['count']++;
}
echo 'This request,session data:'.$_SESSION['count'].'
';
?>
在瀏覽器中打開“ByURLSend.php”,便能看到如下結果:
點擊不同的鏈接,便可以看到在不同頁面間傳遞的同一個會話ID及相關數據
2.3、數據內容方式傳遞
2.3.1、傳遞原理
首次請求時,服務端將當前的會話名稱及會話ID放入Http應答數據包響應正文(通常以字段值的方式放置)中發送到用戶端;用戶端通過POST方法觸發Http請求時,會話名稱及會話ID作為Http請求數據包的請求數據發送到服務端;服務端收到Http請求數據包后,直接解析Http請求數據包的請求數據即可得到會話名稱及會話ID;如果還有需要,服務端再將會話名稱及會話ID放入Http應答數據包響應正文(通常以字段值的方式放置)中發送到用戶端、供用戶端再次POST方法觸發Http請求
2.3.2、案例演示
在同一目錄下創建如下2個PHP腳本文件(ByDataSend.php及ByDataRcve.php):
文件1(ByDataSend.php):
/*
* ByDataSend.php
*/
//打開錯誤及告警提示(不打開E_NOTICE,否則下面使用$_SESSION會有告警)
error_reporting((E_ALL | E_STRICT) & (~E_NOTICE));
//error_reporting(E_ALL | E_STRICT);
//設置會話名稱
session_name('TransID');
//重用現有會話;
$startRst = session_start();
if (!$startRst)
{
echo 'Session start fail!'.'
';
return ;
}
//獲取當前會話名稱
$sessName = session_name();
echo 'session name:'.$sessName.'
';
//獲取當前會話ID
$sessId = session_id();
echo 'session id:'.$sessId.'
';
//讀寫當前會話數據
echo 'Last request,session data:'.$_SESSION['count'].'
';
if (empty($_SESSION['count']))
{
$_SESSION['count'] = 1;
}
else
{
$_SESSION['count']++;
}
echo 'This request,session data:'.$_SESSION['count'].'
';
?>
文件2(ByDataRcve.php):
/*
* ByDataRcve.php
*/
//打開錯誤及告警提示(不打開E_NOTICE,否則下面使用$_SESSION會有告警)
error_reporting((E_ALL | E_STRICT) & (~E_NOTICE));
//error_reporting(E_ALL | E_STRICT);
//設置會話名稱
session_name('TransID');
//獲取當前會話名稱
$sessName = session_name();
//獲取當前會話ID
$sessId = $_POST[$sessName];
if ('' == $sessId)
{
echo 'Session id transmits fail!'.'
';
return ;
}
//設置當前會話ID
session_id($sessId);
//重用現有會話;
$startRst = session_start();
if (!$startRst)
{
echo 'Session start fail!'.'
';
return ;
}
//獲取當前會話名稱
$sessName = session_name();
echo 'session name:'.$sessName.'
';
//獲取當前會話ID
$sessId = session_id();
echo 'session id:'.$sessId.'
';
//讀寫當前會話數據
echo 'Last request,session data:'.$_SESSION['count'].'
';
if (empty($_SESSION['count']))
{
$_SESSION['count'] = 1;
}
else
{
$_SESSION['count']++;
}
echo 'This request,session data:'.$_SESSION['count'].'
';
?>
在瀏覽器中打開“ByDataSend.php”,便能看到如下結果:
點擊“數據內容方式傳遞”按鈕,便可以看到在不同頁面間傳遞的同一個會話ID
總結
以上是生活随笔為你收集整理的php url传递参数_互联网系统(APP、网站等)通信基石——会话(PHP版)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中俄有签订平等条约的吗??
- 下一篇: 动态规划算法php,php算法学习之动态