日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php url传递参数_互联网系统(APP、网站等)通信基石——会话(PHP版)

發布時間:2024/9/27 php 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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版)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。