欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

php中的session完全教程第1/2頁

 更新時間:2007年03月18日 00:00:00   作者:  
一、session概述
session是什么,剛開始我也不明白,非專業(yè)詞典翻譯為會議,會議期。作個不太恰當?shù)谋扔靼?
(雖然不恰當,但意義卻是一樣的),session是你和網(wǎng)站之間的感情。 session在web技術(shù)中占有非常重要的份量。由于網(wǎng)頁是一種無狀態(tài)的連接程序,因此你無法得知用戶的瀏覽狀態(tài)。因此我們必須
通過session記錄用戶的有關(guān)信息,以供用戶再次以此身份對web服務(wù)器提供要求時作確認,例
如,我們在某些網(wǎng)站中常常要求用戶登錄, 但我們怎么知道用戶已經(jīng)登錄了呢,如果沒有session的話,登錄信息是無法保留的,那豈不要讓用戶在每一頁網(wǎng)頁中都要提供用戶名和密碼。
當然,session不光用于用戶身份認證功能,還可能用于其它方面,以后我們會提到的。 session用中文來解釋就是會話期。一個會話期開始于用戶輸入一個站點的網(wǎng)址時,結(jié)束于他離開這個站點時。session最早出現(xiàn)在動態(tài)腳本語言active server pages中,它的功能之強大,是一句話無法說清楚的。
當php還在3.0版本時,session是它永遠的痛。雖然php具有執(zhí)行速度快,使用靈活,功能強大等優(yōu)點,但因為session的問題,使很多站點的開發(fā)放棄了php,至少我的老板是這樣認為的。當時有很多php免費函數(shù)庫提供在php3上實現(xiàn)session的方案,但都讓人感覺不正宗。就好象你花好幾千大洋買的手機卻配置一個很粗糙的草作的袋子一樣,雖然功能是一樣的,但總讓人覺得別扭。php4的出現(xiàn)讓php在session問題上有了翻身的機會。雖然它的session實現(xiàn)還不是很理想(主要是效率問題),但畢竟是它自己實現(xiàn)的,而且可以實際使用了。 那我們用session干什么呢,你說了半天,我用不上的話,你豈不有賣紙張之嫌。ok,我們來看看session有什么用:作過網(wǎng)站的人都有這樣的體會,在一頁頁面中的變量(在本章都指服務(wù)器端變量,下同)是不能在下一頁中用的,雖然有一些辦法可以實現(xiàn),比如用form,urlstring等等,但有些對于用戶來說是不方便的,即使讓form自動提交,但其中的延時在現(xiàn)今的網(wǎng)絡(luò)狀況下足以讓人窒息,而這兩種方法都明顯加大程序員的負擔。如果你正在開發(fā)一個大型項目,那這些額外的負擔是不能忽略的。而有了session就好辦了,session中注冊的變量可以作為全局變量使用。什么,全局變量? 好極了。這樣一來,你知道有什么用了吧:最主要的用于用戶身份認證,程序狀態(tài)記錄,頁面之間參數(shù)傳遞。
說了它這么半天的好處,你已經(jīng)動心了吧,先別高興,它還有缺點呢:它是用文件保存的變量(當然效率不高了,雖然可以用別的方式,但很麻煩的),不能保存對象。與之相對的是,asp中的session可以保存對象變量,用內(nèi)存變量來保存session變量。但為什么我們還選用php呢,呵呵, 為什么,你能從本書的開始看到這章,想必你也應(yīng)該明白了吧,你還不明白,faint,你再從頭看起吧,我保證你成為php專家^_^。
session是怎樣實現(xiàn)的呢?呵呵,你一定以為很高深吧,我來告訴你它的秘密。如果說只保存變量的話,很多讀者都明白,這是很簡單的,但前面我們說過,http協(xié)議是一種無狀態(tài)的連接,你怎么知道那個變量是誰的,這個變量又是誰的呢?在session實現(xiàn)中用cookie實現(xiàn)的。cookie存在于客戶端,也就是用戶的機器中,里面保存著用戶的session id,也就是session號碼,當用戶的瀏覽器請求服務(wù)器時把session id也一起送到服務(wù)器,這樣服務(wù)器就可以識別你是誰,也就可以把變量識別開了。這樣我們就不難理解了,為什么有時session會失效了。不信的話,你可以試試: 在ie的"工具"菜單上有"internet選項"菜單,打開后再選"安全"->"自定義級別",將安全設(shè)置中的"允許使用每個對話cookies"設(shè)為禁用,再看看session能不能用。這下明白了吧!不過php4在linux/unix平臺上可以自動檢查cookies狀態(tài),當cookies 不可用時,自動會把session id附帶在url上進行傳遞。這是它在session方面比asp多的唯一的優(yōu)點了。
二、php3,4中session的實現(xiàn)
在php3中是沒有session這種東東的,但我們又需要,怎么辦呢?別急,有很多人替你做了這些,這其中最有名的要算phplib了。你可以去國外下載,可以上國內(nèi)大部分php站點下載。我們要做的第一件事是讓phplib和php3結(jié)合在一起使它能工作。為了能實現(xiàn)這方面的功能,我們需要先安裝phplib。跟著我來做,很容易的(以下方法在win2000+php3.0.16+apache1.3.12+phplib7.2c+mysql3.23.21 for win32 上通過)phplib最基本的功能包括用戶認證,session管理,權(quán)限及數(shù)據(jù)庫的抽象化。
怎樣使用phplib來實現(xiàn)session功能呢?
一、首先你將phplib解開,里面有一個目錄叫"php",將這個目錄拷貝到apache的安裝目錄下。以筆者的機器為例:我的apache安裝在d:/apache目錄下,我將上面的"php"目錄拷貝到d:a/pache,并將phplib下的pages 目錄下的文件和目錄一起拷貝到 d:/apache/htdocs下,注意不帶目錄本身。phplib的類庫需要根據(jù)系統(tǒng)進行初始化,你可以修改local.inc文件,其中包含著一些基本參數(shù),你可以根據(jù)自己機器的實際情況來進行修改。 將d:/apache/php/prepend.php3文件中的一段程序改為如下樣子:
if (!isset($_phplib) or !is_array($_phplib)) {
$_phplib["libdir"] = "d:/apache/php/"; //這兒改為你放phplib下php目錄的路徑
}
然后將d:/apache/php/local.inc文件改如下:
class db_example extends db_sql {
var $host = "localhost";//你的mysql數(shù)據(jù)庫所在主機名
var $database = "test";//數(shù)據(jù)庫名
var $user = "root";//數(shù)據(jù)庫用戶名
var $password = "";//數(shù)據(jù)庫用戶口令
}
最后一步執(zhí)行解開的phplib目錄中的stuff目錄下的create_database.mysql文件,生成初始表。我們說明一下phplib的工作原理,每一個使用phplib的頁面首先必須可以找到運行phplib所必須類庫文件,我們可以在php3.ini中設(shè)置auto_prepend變量來支持,phplib分發(fā)包中包含一個prepend.php3文件,將auto_prepend指定"d:/apache/php/prepend.php3"(帶引號)后,各頁面就會自動包含phplib類庫,我們還可以將phplib類庫所在目錄加進include變量中,以便可以找到這些文件,當然,最苯的辦法就是指定phplib的絕對路徑,這可不是個好主意,可移植性太差!
第二步,每一個使用phplib的頁面中,你必須首先調(diào)用page_open函數(shù)進行初始化。這會告訴phplib,你現(xiàn)在或?qū)頃玫綘顟B(tài)保存。一個典型的
page_open例子如下:
<?php
page_open(array("sess" => "example_session"));
?>
數(shù)組變量(sess)用來初始化一些狀態(tài)保存對象,注意:必須使用phplib內(nèi)置名(sess),這些內(nèi)置名是你在local.ini中所定義的,page_open函數(shù)必須在頁面內(nèi)容輸出到瀏覽器之前被調(diào)用。php3腳本最后應(yīng)以page_close()結(jié)束,這將會將有關(guān)狀態(tài)數(shù)據(jù)寫回到數(shù)據(jù)庫中,如果你忘了的話,結(jié)果你應(yīng)該能想到,哈哈,你的變量全丟了,可不要怪我沒告訴你...
因為phplib使用了cookies來保存狀態(tài)信息,所以page_open()函數(shù)必須在頁面內(nèi)容輸出到瀏覽器之前被調(diào)用, 這里的頁面內(nèi)容可以是任何html信息或者空行,如果你發(fā)現(xiàn)了錯誤"oops - setcookie called after header has been sent",這表明在page_open()之前向瀏覽器輸出了些什么,你要特別留意空行,因為非常難找到,典型的錯誤是在<? 和 ? >標記之間輸出了空行,你應(yīng)檢查在local.inc和prepend.php3文件中是否包含了空行,這也是一個非常容易出錯的地方。為了減少出錯的可能,我們可以這樣書寫初始化程序:
<?
page_open(array("sess" => "example_session"));
?>
<html>
.....
</html>
第三步,具體使用。
當一個用戶訪問了該網(wǎng)站后,隨即用戶的session就開始了,如果用戶的瀏覽器支持cookie的話,將會建立一個session的id放入cookie,這個唯一的id是由php3隨機生成,然后又用隨機種子字串進行md5加密過了的,這里的cookie應(yīng)該叫做session cookie,因為這個cookie是不會寫到用戶硬盤里去的,當一個session期結(jié)束的時候,該cookie也被完結(jié)了。如果用戶瀏覽器不支持cookie的話,那么 該session的id將會放入url鏈中,因為是加密過的,所以竊取了也沒用。session id存放著用戶的有關(guān)信息,如用戶已認證、認證到期時間、用戶權(quán)限,和其他一些你可能需要的信息,方便我們?nèi)∮?。session其實就是用戶一次會話的過程。session并不是僅僅用來跟蹤用戶的注冊,實際上,它還可以有其它的使用場合,你可以用它來存儲任何你想要存貯的信息,這些信息可以在用戶隨后訪問的頁面中派上用場,當然前提是那些頁面要使用phplib。方法很簡單,注冊一個變量后即可在隨后的頁面中使用它,直至session結(jié)束。方法:
<?php $sess->register( "variable_name"); ?>
注意,這里的variable_name不是變量值,而是變量名,可以先指定變量名,隨后再賦值。你在某個頁面中可以改變變量的值,隨后的頁面訪問該變量會得到改變后的值。變量的類型是多樣的,可以是一個字串,一個數(shù)字,一個數(shù)組。舉例來說明:
第一頁:
<?php
page_open(array("sess" => "example_session"));
$sess->register( "first"); //注意變量名前不需要加$
if (iset($firstname)) {
$first = $firstname;
}
.....
page_close();
?>
第二頁:
<?php
page_open();//開始session
echo $first;//看看效果
page_close();//保存狀態(tài)信息
?>
注冊完一個變量,當頁面最后調(diào)用page_close()函數(shù)后,各個session變量會被寫回到數(shù)據(jù)庫中。如果你忘記調(diào)用page_close()函數(shù)的話,變量就不會被寫回數(shù)據(jù)庫,將出現(xiàn)不可預(yù)知的后果。當變量被使用完畢,你不再需要用到時,可以調(diào)用以下函數(shù)將變量刪除:
<?php
page_open(array("sess" => "example_session"));
...
$sess->unregister( "variable_name");
...
page_close();
?>
phplib 7.0中,使用了一種存儲結(jié)構(gòu),它允許你存儲session數(shù)據(jù)到數(shù)據(jù)庫中、共享內(nèi)存中或者ldap中。phplib使用了數(shù)據(jù)庫類,這使得你有了更多的選擇,你可以選用oracle8,mysql,postgresql等等數(shù)據(jù)庫來保存狀態(tài)信息。
關(guān)于phplib中的其它功能以及有關(guān)session的其它函數(shù)的使用,你可以參看它帶的手冊,或上它的網(wǎng)站看在線文檔。它的老家在http://phplib.netuse.de/index.php3 。php4的session實現(xiàn)大都從phplib學來的,它也靠cookies保存session id,用文件系統(tǒng)保存變量(默認情況下)。因此,它的session變量不能保存對象(事實上能保存對象內(nèi)容,但沒有意義,因為它是保存在磁盤上的,不是活的對象,充其量也就是對象尸體。)不過這點的限制不是太大,我們在大部分情況下都只需要保存變量就行了。當然你也可以將session保存在數(shù)據(jù)庫中,下一小節(jié)中我們會講到怎樣將session保存在數(shù)據(jù)庫中。在php4中由于比php3多了session支持,所以在php.ini文件中也多了session配置選項。下面我們來看看各項的作用與意義:
[session]
session.save_handler = files ; handler used to store/retrieve data(用什么保存session變量,默認情況下用文件)
session.save_path = c:/temp ; argument passed to save_handler(保存session變量的目錄,在linux/unix下為/tmp,在win下設(shè)為你的目錄)
; in the case of files, this is the
; path where data files are stored
session.use_cookies = 1 ; whether to use cookies(是否使用cookies,當然,在win下別無選擇)
session.name = phpsessid
; name of the session(默認session使用的cookies名,建議不要改動)
; is used as cookie name
session.auto_start = 0 ; initialize session on request startup(是否自動啟用session,當為1時,在每頁中就可以不必調(diào)用session_start()函數(shù)了)
session.cookie_lifetime = 0 ; lifetime in seconds of cookie(設(shè)定 cookie 送到瀏覽器后的保存時間,單位為秒。缺省值為 0,表示直到瀏覽器關(guān)閉。)
; or if 0, until browser is restarted
session.cookie_path = / ; the path the cookie is valid for(cookie)(cookies有效路徑)
session.cookie_domain = ; the domain the cookie is valid for(cookies有效域名)
session.serialize_handler = php ; handler used to serialize data(定義序列化數(shù)據(jù)的標識,本功能只有 wddx 模塊或 php 內(nèi)部使用。缺省值為 php)
; php is the standard serializer of php
session.gc_probability = 1 ; percentual probability that the (設(shè)定每次臨時文件開始處理 (gc, garbage collection) 處理概率。缺省值為 1。 )
; 'garbage collection' process is started
; on every session initialization
session.gc_maxlifetime = 1440 ; after this number of seconds, stored(設(shè)定保存session的臨時文件被清除前的存活秒數(shù))
; data will be seen as 'garbage' and
; cleaned up by the gc process
session.referer_check = ; check http referer to invalidate (決定參照到客戶端的session 代碼是否要刪除。有時在安全或其它考慮時,會設(shè)定不刪除。缺省值為 0。)
; externally stored urls containing ids
session.entropy_length = 0 ; how many bytes to read from the file(設(shè)定 session 從高熵值資源讀取的位數(shù)。缺省值為 0.)
session.entropy_file = ; specified here to create the session id(設(shè)定 session 代碼建立時,使用外部高熵值資源或文件來建立,例如 unix 系統(tǒng)上的 /dev/random 或 /dev/urandom。 )
; session.entropy_length = 16
; session.entropy_file = /dev/urandom
session.cache_limiter = nocache ; set to { nocache,private,public } to (設(shè)定session緩沖限制)
; determine http caching aspects
session.cache_expire = 180 ; document expires after n minutes(文檔有效期,單位為分鐘)
在windows平臺下,php4.01pl2以前的版本會出現(xiàn)設(shè)置session.save_path 后出錯的情況,這是php的一個bug,在php4.01pl2及以后已經(jīng)修正了。如果你用以前的版本,你可以將session.save_path設(shè)為"./",或設(shè)為"/temp",并在你放置php腳本的當前盤根目錄下建一個名為temp的目錄即可(我的php腳本放在d:apachehtdocs下,則我在d:盤根目錄下建一名為temp的目錄)。
在php4中有關(guān)session的函數(shù)主要有以下這些:
session_start: 初始化session,需要用session的每一個頁面最開始處調(diào)用。
session_destroy: 結(jié)束 session,在需要結(jié)束session處調(diào)。
session_name: 存取目前 session 名稱。
session_module_name: 存取目前 session 模塊。
session_save_path: 存取目前 session 路徑。
session_id: 存取目前 session id號。
session_register: 注冊新的session變量。
session_unregister: 刪除已注冊session變量。
session_is_registered: 檢查session變量是否注冊。
session_decode: session 數(shù)據(jù)解碼。
session_encode: session 數(shù)據(jù)加密。
通常情況下我們只需要調(diào)用三個函數(shù)即可。
即sesssion_start()、session_register()、session_is_registered()。
在需要用到session的每一頁的最開始處調(diào)用session_start()函數(shù),
一個典型的使用session的頁面如下:
<?session_start()?>
<html>
....
<body>
<?
$var="hello";
session_register("var");//注冊$var變量,注意沒有$符號
if(session_is_registered("var"))//檢查變量是否注冊
echo "haha,注冊了!";
else
echo "sorry,還沒有注冊!";
?>
</body>
</html>
php4中session處理的定制
我們需要擴充6個函數(shù),當然這些函數(shù)不需你去調(diào)用,對我們來說是透明的。
這幾個函數(shù)是:
sess_open($sess_path, $session_name);
這個函數(shù)被session處理程序調(diào)用來作初始化工作。需要傳給它的兩個參數(shù)是$sess_path,它對應(yīng)你的php.ini文件中的session.save_path選項;$session_name,它對應(yīng)php.ini中的session.name 選項。它們具體怎樣工作,請看下面的例子。
sess_close();
這個函數(shù)在頁面結(jié)束執(zhí)行并且session處理程序需要關(guān)閉時被調(diào)用。(注意,不要和sess_destory混淆了,它是用來結(jié)束session的)
sess_read($key);
這個函數(shù)在session處理程序讀取指定session鍵值($key)時。
這個函數(shù)檢索并返回標識為$key的session數(shù)據(jù).(注意:你不用擔心怎樣序列化和反序列化數(shù)據(jù),如果你不知道這是什么意思,不要擔心它)
譯者注:序列化是將變量或?qū)ο笤诔绦蚪Y(jié)束或需要時保存在文件中,在下次程序運行或需要時再
調(diào)入內(nèi)存的技術(shù),有別于只保存數(shù)據(jù)的方法。
sess_write($key, $val);
這個函數(shù)據(jù)在session處理程序需要將數(shù)據(jù)保存時調(diào)用,這種情況經(jīng)常在你的程序結(jié)束時發(fā)生。它負責將數(shù)據(jù)保存在下次能用sess_read($key)函數(shù)檢索的地方。
sess_destroy($key);
這個函數(shù)在需要消毀session時。它負責刪除session并且清除環(huán)境。
sess_gc($maxlifetime);
這個函數(shù)負責清理碎片。在這種情況下,它負責刪除過時的session數(shù)據(jù)。session處理程序會偶爾調(diào)用它們。
現(xiàn)在我們已經(jīng)清楚了我們提供的函數(shù)。
定制程序可以用mysql數(shù)據(jù)庫或dbm文件保存session數(shù)據(jù)。取決于你的需要。
如果你決定使用mysql作支持,那需要作以下工作:
首先我們在mysql中創(chuàng)建一個sessions數(shù)據(jù)庫,并且創(chuàng)建一個sessions表。先運行你的mysql客戶端并且執(zhí)行下面的命令:
mysql> create database sessions;
mysql> grant select, insert, update, dele 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* 變量使其匹配你機器上的數(shù)據(jù)庫設(shè)置。

相關(guān)文章

最新評論