溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何理解PHP會(huì)話

發(fā)布時(shí)間:2021-09-29 11:08:42 來(lái)源:億速云 閱讀:113 作者:iii 欄目:開(kāi)發(fā)技術(shù)

本篇內(nèi)容介紹了“如何理解PHP會(huì)話”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

1、導(dǎo)讀

從文題目看,<簡(jiǎn)單PHP會(huì)話(Session)說(shuō)明> 是已經(jīng)圈定了本文的內(nèi)容范圍,試圖闡明Session(文中對(duì)會(huì)話稱為Session) 在PHP語(yǔ)言中是如何實(shí)現(xiàn)以及使用的,重點(diǎn)在于基本理解后的使用。

文章思路是首先搞清楚session是什么東西,Session有什么用,Session使用的套路是什么,PHP中是如何使用的。

2、會(huì)話(Session)說(shuō)明

開(kāi)始前,首先推薦一本基礎(chǔ)理論書(shū)《HTTP權(quán)威指南》,是程序員基礎(chǔ)必備知識(shí),作者有電子版,有需要的可以留言。

a. Session的由來(lái)

幾乎每個(gè)人都上網(wǎng),數(shù)以億計(jì)的數(shù)據(jù)在網(wǎng)絡(luò)中相互傳輸,數(shù)據(jù)之所以能夠安全的傳輸,是基于HTTP協(xié)議的,很是耳熟能詳是吧。其實(shí)HTTP協(xié)議所干的事情就是提供完成你的網(wǎng)絡(luò)訪問(wèn)一系列方法,雙方構(gòu)建了一次訪問(wèn),原則上就是一個(gè)會(huì)話建立了。說(shuō)一個(gè)例子:小明在瀏覽器中輸入https://www.baidu.com/(HTTPS是HTTP的加密版本,相比是增加了SSL加密層),這是小明對(duì)百度發(fā)起了一個(gè)請(qǐng)求,說(shuō):“我要看你的界面”,百度的服務(wù)器們收到信息,信息中包括了小名想干的事情,同時(shí)包括了小明的地址(否則百度不知道把內(nèi)容給誰(shuí)了),服務(wù)器核對(duì)信息OK,對(duì)小明這個(gè)請(qǐng)求進(jìn)行備案,發(fā)送出小名想要的東西,一次完整的請(qǐng)求結(jié)束了。 這就是一次會(huì)話,會(huì)話的核心在于小明的信息備案(其實(shí)還涉及到TCP/IP的連接問(wèn)題,這個(gè)與本文無(wú)關(guān),忽略)。

其實(shí)與其說(shuō)是構(gòu)建了一個(gè)Session,倒不如說(shuō)將一次訪問(wèn)概括為一個(gè)Session。

b. Session能干什么用

從上面內(nèi)容可以得到,每一個(gè)訪問(wèn)都是一個(gè)會(huì)話,服務(wù)器都要備案信息,這是有開(kāi)銷的,同時(shí)呢,也不大可能同一個(gè)人連續(xù)訪問(wèn)十次二十次就構(gòu)建保存十次二十次,一個(gè)是增加開(kāi)銷,另一個(gè)是也比較蠢了。也就是說(shuō),一個(gè)人(確切說(shuō)是同一個(gè)電腦和瀏覽器),在某個(gè)特定時(shí)間內(nèi),能夠復(fù)用一個(gè)Session的,為什么在特定時(shí)間內(nèi)呢?因?yàn)镾ession是有默認(rèn)的過(guò)期時(shí)間,過(guò)期后服務(wù)器就清理掉了(如果不這樣,你想想世界那么多人,來(lái)一個(gè)保留一個(gè),太虧)。

ok,既然同一個(gè)人,多次訪問(wèn)都是一個(gè)Session(不要懷疑服務(wù)器無(wú)法判別是同一個(gè)人,具體可以看上面推介的書(shū)),而且每次訪問(wèn)的內(nèi)容都是做備案的,那么也就是說(shuō),你Session周期內(nèi)所有的行為服務(wù)器都是知道的,那么接下來(lái)重要的作用就來(lái)了,服務(wù)器通過(guò)對(duì)你的訪問(wèn)請(qǐng)求分析,能夠獲知到這個(gè)特定用戶的行為偏好的,通過(guò)做一定的分析,能夠推送一些用戶喜歡關(guān)心的數(shù)據(jù),廣告定向也就是這么來(lái)的。 

當(dāng)然可能還有其他的用戶,性能等等之類的,個(gè)人不是特別理解機(jī)理,這里就這樣。

3、PHP中Session的使用

通過(guò)上面的啰嗦,可以發(fā)現(xiàn),Session這個(gè)概念其實(shí)是在服務(wù)器端發(fā)生的。PHP提供了一系列的配置、函數(shù)等,很好的實(shí)現(xiàn)Session功能。Session支持在 PHP 中是在并發(fā)訪問(wèn)時(shí)由一個(gè)方法來(lái)保存某些數(shù)據(jù).從而使你能夠構(gòu)建更多的定制程序 從而提高你的 web 網(wǎng)站的吸引力. 一個(gè)訪問(wèn)者訪問(wèn)你的 web 網(wǎng)站將被分配一個(gè)唯一的 id, 就是所謂的session id. 這個(gè) id 可以存儲(chǔ)在用戶端的一個(gè) cookie 中,也可以通過(guò) URL 進(jìn)行傳遞.會(huì)話支持允許你將請(qǐng)求中的數(shù)據(jù)保存在超全局?jǐn)?shù)組$_SESSION中. 當(dāng)一個(gè)訪問(wèn)者訪問(wèn)你的網(wǎng)站,PHP 將自動(dòng)檢查(如果 session.auto_start 被設(shè)置為 1)或者在你要求下檢查(明確通過(guò)session_start()或者隱式通過(guò)session_register()) 當(dāng)前session id 是否是先前發(fā)送的請(qǐng)求創(chuàng)建. 如果是這種情況, 那么先前保存的環(huán)境將被重建.

a. php中session基本用法

通過(guò)為每個(gè)獨(dú)立用戶分配唯一的Session ID,可以實(shí)現(xiàn)針對(duì)不同用戶分別存儲(chǔ)數(shù)據(jù)的功能。 會(huì)話通常被用來(lái)在多個(gè)頁(yè)面請(qǐng)求之間保存及共享信息。 一般來(lái)說(shuō),Session ID 通過(guò) cookie 的方式發(fā)送到瀏覽器,并且在服務(wù)器端也是通過(guò)會(huì)話 ID 來(lái)取回會(huì)話中的數(shù)據(jù)。 如果請(qǐng)求中不包含會(huì)話 ID 信息,那么 PHP 就會(huì)創(chuàng)建一個(gè)新的Session,并為新創(chuàng)建的Session分配新的 ID。

Session的工作流程很簡(jiǎn)單。當(dāng)開(kāi)始一個(gè)Session時(shí),PHP 會(huì)嘗試從請(qǐng)求中查找Session ID (通常通過(guò)Session cookie), 如果請(qǐng)求中不包含Session ID 信息,PHP 就會(huì)創(chuàng)建一個(gè)新的Session。 Session開(kāi)始之后,PHP 就會(huì)將Session中的數(shù)據(jù)設(shè)置到 $_SESSION變量中。 當(dāng) PHP 停止的時(shí)候,它會(huì)自動(dòng)讀取$_SESSION中的內(nèi)容,并將其進(jìn)行序列化, 然后發(fā)送給會(huì)話保存管理器器來(lái)進(jìn)行保存。默認(rèn)情況下,PHP 使用內(nèi)置的文件Session保存管理器(files)來(lái)完成Session的保存。 也可以通過(guò)配置項(xiàng)session.save_handler(php.ini中配置項(xiàng)目)來(lái)修改所要采用的Session保存管理器。 對(duì)于文件Session保存管理器,Session會(huì)話數(shù)據(jù)保存到配置項(xiàng)session.save_path (php.ini中配置項(xiàng)目)所指定的位置??梢酝ㄟ^(guò)調(diào)用函數(shù)session_start來(lái)手動(dòng)開(kāi)始一個(gè)會(huì)話。 如果配置項(xiàng)session.auto_start 設(shè)置為1, 那么請(qǐng)求開(kāi)始的時(shí)候,Session會(huì)自動(dòng)開(kāi)始。PHP 腳本執(zhí)行完畢之后,session會(huì)自動(dòng)關(guān)閉。 同時(shí),也可以通過(guò)調(diào)用函數(shù)session_wirte_close() 來(lái)手動(dòng)關(guān)閉會(huì)話。

b. php中session信息在php.ini中配置

這部分內(nèi)容放在這里說(shuō)是因?yàn)?,不說(shuō)明前面問(wèn)題,鬼知道php.ini中的配置是什么東西。 上面提到的session.save_handler和session.save_path,這兩個(gè)就是php.ini中的配置項(xiàng)目,這里面這塊不細(xì)說(shuō),因?yàn)閜hp手冊(cè)實(shí)在是太詳細(xì)了。本文默認(rèn)模式是files。

c. php中的session機(jī)制

session_start()是session機(jī)制的開(kāi)始,session會(huì)判斷當(dāng)前是否有$_COOKIE[session_name()];session_name()返回保存session_id的COOKIE鍵值,如果不存在會(huì)生成一個(gè)session_id,然后把生成的session_id作為COOKIE的值傳遞到客戶端.相當(dāng)于執(zhí)行了下面COOKIE 操作。相反,如果存在session_id =$_COOKIE[session_name];然后去session.save_path指定的文件夾里去找名字為'SESS_'.session_id()的文件.讀取文件的內(nèi)容反序列化,然后放到$_SESSION中。

在會(huì)話結(jié)束的時(shí)候,會(huì)執(zhí)行Session寫(xiě)入操作或是手工執(zhí)行session_write_close()操作。

代碼里面銷毀Session一般有三個(gè)方法,    

1. setcookie(session_name(),session_id(),time() -8000000,..); //退出登錄前執(zhí)行

2. usset($_SESSION); //這會(huì)刪除所有的$_SESSION數(shù)據(jù),刷新后,有COOKIE傳過(guò)來(lái),但是沒(méi)有數(shù)據(jù)。

3. session_destroy(); //刪除$_SESSION 刪除session文件以及session_id

附錄,引用網(wǎng)絡(luò)上的一段代碼,作為結(jié)尾吧。

<span >  </span>//SESSION初始化的時(shí)候調(diào)用 
   function open($save_path, $session_name) 
   { 
    global $sess_save_path; 
    $sess_save_path=$save_path; 
    return(true); 
   } 
 
   //關(guān)閉的時(shí)候調(diào)用 
   function close() 
   { 
    return(true); 
   } 
 
   function read($id) 
   { 
    global $sess_save_path; 
    $sess_file="$sess_save_path/sess_$id"; 
    return (string) @file_get_contents($sess_file); 
   } 
   //腳本執(zhí)行結(jié)束之前,執(zhí)行寫(xiě)入操作 
   function write($id,$sess_data) 
   { 
 
    global$sess_save_path; 
 
    $sess_file="$sess_save_path/sess_$id"; 
    if ($fp= @fopen($sess_file,"w")) { 
     $return=fwrite($fp,$sess_data); 
     fclose($fp); 
     return$return; 
    } else { 
     return(false); 
    } 
 
   } 
     
   function destroy($id) 
   { 
    global $sess_save_path; 
 
    $sess_file="$sess_save_path/sess_$id"; 
    return(@unlink($sess_file)); 
   } 
 
   function gc($maxlifetime) 
   { 
    global$sess_save_path; 
 
    foreach (glob("$sess_save_path/sess_*") as$filename) { 
     if (filemtime($filename) +$maxlifetime<time()) { 
      @unlink($filename); 
     } 
    } 
    return true; 
   }

“如何理解PHP會(huì)話”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI