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