在本教程中,您將學(xué)習(xí)如何使用PHP會(huì)話將某些數(shù)據(jù)臨時(shí)存儲(chǔ)在服務(wù)器上。
盡管您可以使用Cookie存儲(chǔ)數(shù)據(jù),但是它存在一些安全問題。 由于cookie存儲(chǔ)在用戶計(jì)算機(jī)上,因此攻擊者可以輕松地修改cookie內(nèi)容,以在您的應(yīng)用程序中插入可能有害的數(shù)據(jù),從而可能破壞您的應(yīng)用程序。
此外,每次瀏覽器向服務(wù)器請求URL時(shí),網(wǎng)站的所有cookie數(shù)據(jù)都會(huì)在請求中自動(dòng)發(fā)送到服務(wù)器。 這意味著如果您在用戶系統(tǒng)上存儲(chǔ)了5個(gè)Cookie,每個(gè)Cookie的大小為4KB,則瀏覽器需要在用戶每次查看頁面時(shí)上傳20KB的數(shù)據(jù),這可能會(huì)影響您站點(diǎn)的性能。
您可以通過使用PHP session來解決這兩個(gè)問題。 PHP session將數(shù)據(jù)存儲(chǔ)在服務(wù)器而不是用戶的計(jì)算機(jī)上。 在基于會(huì)話的環(huán)境中,每個(gè)用戶都是通過稱為會(huì)話標(biāo)識(shí)符或SID的唯一編號(hào)來標(biāo)識(shí)的。 此唯一的會(huì)話ID用于將每個(gè)用戶與自己在服務(wù)器上的信息(例如電子郵件,帖子等)鏈接起來。
提示:session ID是由PHP引擎隨機(jī)生成的,幾乎無法猜測。此外,由于會(huì)話數(shù)據(jù)存儲(chǔ)在服務(wù)器上,因此不必隨每個(gè)瀏覽器請求一起發(fā)送。
在將任何信息存儲(chǔ)在會(huì)話變量中之前,必須首先啟動(dòng)Session。要開始新的Session,只需調(diào)用PHP session_start()函數(shù)。它將創(chuàng)建一個(gè)新會(huì)話并為用戶生成一個(gè)唯一的Session ID。
下面示例中的PHP代碼只是開始一個(gè)新Session。
<?php //開始 session session_start(); ?>
session_start()函數(shù)首先通過查找會(huì)話ID的存在來檢查會(huì)話是否已經(jīng)存在。如果找到一個(gè)會(huì)話,即會(huì)話已經(jīng)啟動(dòng),則設(shè)置會(huì)話變量,如果沒有,則通過創(chuàng)建新的會(huì)話ID來啟動(dòng)新會(huì)話。
注意:您必須session_start()在頁面的開頭(即在瀏覽器中腳本生成的任何輸出之前)調(diào)用該函數(shù),就像在使用setcookie()函數(shù)設(shè)置cookie時(shí)一樣。
您可以將所有會(huì)話數(shù)據(jù)作為鍵值對存儲(chǔ)在$_SESSION[]超全局?jǐn)?shù)組中??梢栽跁?huì)話的生存期內(nèi)訪問存儲(chǔ)的數(shù)據(jù)??匆韵履_本,該腳本創(chuàng)建一個(gè)新會(huì)話并注冊兩個(gè)會(huì)話變量。
<?php //正在啟動(dòng)會(huì)話 session_start(); //存儲(chǔ)會(huì)話數(shù)據(jù) $_SESSION["firstname"] = "Peter"; $_SESSION["lastname"] = "Parker"; ?>
要訪問我們在上一個(gè)示例中從同一Web域的任何其他頁面上設(shè)置的會(huì)話數(shù)據(jù),只需調(diào)用session_start()即可重新創(chuàng)建會(huì)話,然后將相應(yīng)的鍵傳遞給$_SESSION關(guān)聯(lián)數(shù)組。
<?php //正在啟動(dòng)會(huì)話 session_start(); //訪問會(huì)話數(shù)據(jù) echo 'Hi, ' . $_SESSION["firstname"] . ' ' . $_SESSION["lastname"]; ?>
上面示例中的PHP代碼產(chǎn)生以下輸出。
Hi, Peter Parker
注意:要訪問同一頁面中的會(huì)話數(shù)據(jù),無需重新創(chuàng)建會(huì)話,因?yàn)樗言陧撁骓敳繂?dòng)。
如果要?jiǎng)h除某些會(huì)話數(shù)據(jù),只需取消設(shè)置$_SESSION關(guān)聯(lián)數(shù)組的相應(yīng)鍵,如以下示例所示:
<?php //啟動(dòng)會(huì)話 session_start(); //正在刪除會(huì)話數(shù)據(jù) if(isset($_SESSION["lastname"])){ unset($_SESSION["lastname"]); } ?>
但是,要完全銷毀會(huì)話,只需調(diào)用session_destroy()函數(shù)。該函數(shù)不需要任何參數(shù),一次調(diào)用會(huì)銷毀所有會(huì)話數(shù)據(jù)。
<?php //啟動(dòng)會(huì)話 session_start(); //銷毀會(huì)話 session_destroy(); ?>
注意:在使用session_destroy()函數(shù)銷毀會(huì)話之前,如果會(huì)話環(huán)境尚未存在,則需要先使用session_start()函數(shù)重新創(chuàng)建該會(huì)話環(huán)境,以便進(jìn)行銷毀。
每個(gè)PHP會(huì)話都有一個(gè)超時(shí)值(持續(xù)時(shí)間,以秒為單位),該值確定在沒有任何用戶活動(dòng)的情況下會(huì)話應(yīng)保持活動(dòng)狀態(tài)的時(shí)間。 您可以通過更改PHP配置文件(php.ini)中session.gc_maxlifetime變量的值來調(diào)整此超時(shí)時(shí)間。