PHP中session使用方法詳解(jiě)
PHP中session詳解
綜述
Session指的就是用戶在瀏覽(lǎn)某(mǒu)個網站時,從進(jìn)入網(wǎng)站到瀏覽器關閉所經過的這段時間,也就是用(yòng)戶瀏覽這個網(wǎng)站所花費的時間(jiān)。從上(shàng)述的定義(yì)中我們可以看到,Session實(shí)際上(shàng)是一個特定(dìng)的時間概(gài)念。
一般來說,在網(wǎng)站上某一個頁麵中的變量(指服務器端變量,下同)是不能在下(xià)一頁中用的,有了session就好辦了(le)。session中注冊的變量可以(yǐ)作為(wéi)全局變量(liàng)使用。這樣我們就可以將session用於(yú)用戶身份(fèn)認證,程序狀態(tài)記錄,頁麵之間參數傳(chuán)遞。
在PHP3版本中是如何實現session的?
php3本身是(shì)沒有實現session功能(néng)的,我(wǒ)們隻有用其他的方法來實現(xiàn),這(zhè)其(qí)中(zhōng)最有名的要算phplib了。phplib最基本的功(gōng)能包括用戶認證、Session管(guǎn)理(lǐ)、權限及數(shù)據(jù)庫的抽象(xiàng)化。下麵我們(men)就(jiù)講述一下如何用phplib實現session。
1、首先安裝phplib(環境為win2000+php3.0.16+Apache1.3.12+phplib7.2c+mysql3.23.21 for win32)
首先將phplib解開,裏麵有一個"php"目錄,將這(zhè)個目錄拷貝(bèi)到Apache的安(ān)裝目錄下。例如:Apache安裝在d:\Apache 目(mù)錄下(xià),那麽就將"php"目錄拷貝到d:\Apache,並將phplib目錄的(de)pages目錄下(不(bú)包括目錄(lù)本身)的(de)文件(jiàn)和目(mù)錄一(yī)起拷(kǎo)貝(bèi)到d:\Apache\htdocs下。
phplib的類庫(kù)需(xū)要根(gēn)據(jù)係統進行初始化,可能需要修(xiū)改local.inc文件(jiàn),其中包含著一些(xiē)基本參數,可以根據自己(jǐ)機器的實際情況來進行修改。
將d:\Apache\php\prepend.php文件中(zhōng)的一段程(chéng)序改為如下(xià)樣子(zǐ):
if (!isset($_PHPLIB) or !is_array($_PHPLIB)) {
$_PHPLIB["libdir"] = "d:/Apache/php/"; //放phplib下(xià)php目錄的路徑
}
修改d:\Apache\php\local.inc文件(jiàn):
class DB_Example extends DB_Sql {
var $Host = "localhost"; //mysql數據庫所在主(zhǔ)機名(míng)
var $Database = "test"; //數據庫名
var $User = "root"; //數據庫用戶名
var $Password = "1234567"; //數據(jù)庫用(yòng)戶密碼(mǎ)
}
最後根據phplib目錄下(xià)的stuff子目錄中的create_database.mysql文件(jiàn)生成初始表。
由(yóu)於(yú)每一個使用phplib的(de)頁麵(miàn)首先必須可以找到運行phplib所必需的類庫文(wén)件(jiàn),我們可以(yǐ)在php.ini中(zhōng)設置auto_prepend變量來(lái)支持,phplib中(zhōng)包(bāo)含一個(gè)prepend.php文件,並(bìng)將auto_prepend指定為"d:/Apache/php/prepend.php"(帶引號)後,各頁麵就會自(zì)動包含(hán)phplib類庫,我們(men)還(hái)可(kě)以(yǐ)將phplib類庫所在目錄加進include變量中,以(yǐ)便(biàn)可以(yǐ)找(zhǎo)到這些文(wén)件。
2、調用page_open()函數
在每一個使用phplib的頁(yè)麵中,必須首(shǒu)先調用page_open函數進行初(chū)始化,例如:
<?php
page_open(array("sess" => "Test_Session"));
?>
數組(zǔ)變(biàn)量(liàng)(sess)用來初始化一些狀態保存(cún)對象,這(zhè)裏應該注意:必須(xū)使用(yòng)phplib內置名(sess),這(zhè)些內置名是在local.inc中所定義的.。
因為phplib使用了Cookies來保(bǎo)存狀態信息,所(suǒ)以page_open()函數必須在頁(yè)麵內容輸出到瀏覽(lǎn)器之前被調用。php腳本(běn)最後(hòu)應以(yǐ)page_close()結束,這將會將有關狀(zhuàng)態數據寫回到數據庫中,否則(zé)變量會丟(diū)失。
3、具體使(shǐ)用。
注冊一(yī)個變量後即可在隨後的(de)頁麵中使用它,直至session結束。方法:
<?php $sess->register( "varname"); ?>
注意,這裏的varname不是變量值,而是變量名,可以先指定變量名,隨後再賦值。你在某個頁麵(miàn)中可(kě)以改變變量的值,隨後(hòu)的頁麵訪(fǎng)問該變量時(shí)會得到改變(biàn)後的值。變量(liàng)的類型是多樣的,可以(yǐ)是一(yī)個字符串,一個數字(zì),一個數組(zǔ)。舉例來說明:
第一頁:
<?php
page_open(array("sess" => "Test _Session"));
$sess->register( "welcome"); //注冊變量$welcome,注(zhù)意不需要加$
$welcome="Hello,PHP world!";
……
page_close();
?>
第二頁:
<?php
page_open();//開(kāi)始session
echo $welcome;//顯示第(dì)一頁中定義(yì)的$welcome
page_close();//保存狀態信息
?>
注(zhù)冊完一(yī)個變量,當頁麵最(zuì)後(hòu)調用page_close()函數後,各個session變(biàn)量會被寫回(huí)到(dào)數據(jù)庫(kù)中。如果(guǒ)忘記調(diào)用page_close()函數的話,變量就不會被寫回數據(jù)庫,這(zhè)樣將出現(xiàn)不(bú)可預知的後果。當變量被使(shǐ)用完畢(bì),不(bú)再需要用到時(shí),可(kě)以調用以(yǐ)下函數將變(biàn)量刪除:
<?php
page_open(array("sess" => "Test _Session"));
……
$sess->unregister( "variable_name");
……
page_close();
?>
在(zài)PHP4版本中是(shì)如何實現session的?
php4的session也(yě)靠cookies保存session id,用文件係統保存變量(liàng)(默認情況下),因此(cǐ),它(tā)的session變量不能保存對象。當然(rán)也(yě)可(kě)以將session保存在(zài)數據庫中(zhōng)。
在php4中有關session的函數很多(詳見php.ini配(pèi)置一文),通常情況下我(wǒ)們隻需要調用(yòng)三個函數即可:sesssion_start()、session_register()、session_is_registered()。
在需要(yào)用到session的每(měi)一頁的(de)最(zuì)開始處調用session_start()函數, 例如:
<?session_start()?>
<html><body>
<?
$welcome="hello world !";
session_register("welcome");//注(zhù)冊$welcome變量,注意沒有$符號
if(session_is_registered("welcome"))//檢查$welcome變(biàn)量(liàng)是否注冊
echo "welcome變(biàn)量(liàng)已經(jīng)注冊了!";
else
echo "welcome變量還沒有注冊!";
?>
</body></html>
php4中session處(chù)理(lǐ)的定(dìng)製(zhì)
我們需要擴充6個函數:
sess_open($sess_path, $session_name);
這個函(hán)數被session處理程序調用來作初始(shǐ)化工作。
參數$sess_path對(duì)應php.ini文(wén)件(jiàn)中的session.save_path選項(xiàng)
參數$session_name對應php.ini中(zhōng)的(de)session.name 選項。
sess_close();
這個(gè)函數在頁麵結束執行並且session處理(lǐ)程序需(xū)要關閉時(shí)被調用
sess_read($key);
這個函數在(zài)session處理程序讀取指定session鍵值($key)時,檢索並(bìng)返回標識(shí)為$key的session數(shù)據(jù).(注意:序列(liè)化是(shì)將變量或(huò)對(duì)象(xiàng)在程序結束或需要(yào)時保存在文件中,在下次程序運行或需要時再調入內存(cún)的技(jì)術,有別於隻(zhī)保(bǎo)存數據的(de)方(fāng)法。)
sess_write($key, $val);
這個函數(shù)據在(zài)session處理程序(xù)需要將數據保(bǎo)存(cún)時調用(yòng),這種情況經(jīng)常在程序結束時(shí)發生。它負責將數據(jù)保存在下次能用sess_read($key)函數檢索的地方(fāng)。
sess_destroy($key);
這(zhè)個函數在需要消毀session時。它負責(zé)刪除session並且清除(chú)環境。
sess_gc($maxlifetime);
這個(gè)函數(shù)負責(zé)清理(lǐ)碎(suì)片。在(zài)這種情(qíng)況下,它負責刪除過時的session數據。session處理程序會偶爾調(diào)用它們(men)。
定製程序可以用mysql數據庫(kù)或DBM文件保存session數據,視具體的情(qíng)況而定。如(rú)果使用mysql作支(zhī)持,那(nà)還(hái)需(xū)要進行以下的步(bù)驟:
首(shǒu)先在mysql中創建一個sessions數據庫,並且創(chuàng)建一(yī)個sessions表(biǎo):
mysql> CREATE DATABASE sessions;
mysql> GRANT select, insert, update, delete ON sessions.* TO phpsession@localhost
-> IDENTIFIED BY 'phpsession';
mysql> CREATE TABLE sessions (
-> sesskey char(32) not null,
-> expiry int(11) unsigned not null,
-> value text not null,
-> PRIMARY KEY (sesskey)
-> );
下一步,修改session_mysql.php文件的$SESS_DB* 變(biàn)量使其(qí)匹(pǐ)配你機器上的數據庫設置:
<?
$SESS_DBHOST = "localhost"; /* 數據庫(kù)主(zhǔ)機名 */
$SESS_DBNAME = "sessions"; /* 數據庫名 */
$SESS_DBUSER = "phpsession"; /* 數據庫用戶名(míng) */
$SESS_DBPASS = "phpsession"; /* 數據庫密碼 */
$SESS_DBH = "";
$SESS_LIFE = get_cfg_var("session.gc_maxlifetime");
……//定製函數(shù)
session_set_save_handler( "sess_open", "sess_close", "sess_read", "sess_write", "sess_destroy", "sess_gc");
?>
定製(zhì)使用dbm文件(jiàn)時的接
關鍵詞(cí):PHP,session
閱讀本文後您有什麽感想? 已有(yǒu) 人給出評價(jià)!
- 1
- 457
- 1
- 1
- 2
- 1