session全教程(二)_PHP

來源:互聯網
上載者:User
關鍵字 教程 session 變數 key 函數 phplib 需要
二、php3,4中session的實現

在php3中是沒有session這種東東的,但我們又需要,怎麼辦呢?別急,有很多人替你做了這些,這其中最有名的要算phplib了。你可以去國外下載,可以上國內大部分php網站下載。我們要做的第一件事是讓phplib和php3結合在一起使它能工作。為了能實現這方面的功能,我們需要先安裝phplib。跟著我來做,很容易的(以下方法在win2000+php3.0.16+apache1.3.12+phplib7.2c+mysql3.23.21 for win32 上通過)phplib最基本的功能包括使用者認證,Session管理,許可權及資料庫的抽象化。

怎樣使用phplib來實現session功能呢?

一、首先你將phplib解開,裡面有一個目錄叫"php",將這個目錄拷貝到apache的安裝目錄下。以筆者的機器為例:我的apache安裝在d:/apache目錄下,我將上面的"php"目錄拷貝到d:a/pache,並將phplib下的pages 目錄下的檔案和目錄一起拷貝到 d:/apache/htdocs下,注意不帶目錄本身。phplib的類庫需要根據系統進行初始化,你可以修改local.inc檔案,其中包含著一些基本參數,你可以根據自己機器的實際情況來進行修改。 將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資料庫所在主機名稱
var $Database = "test";//資料庫名
var $User = "root";//資料庫使用者名稱
var $Password = "";//資料庫使用者口令
}

最後一步執行解開的phplib目錄中的stuff目錄下的create_database.mysql檔案,產生初始表。我們說明一下phplib的工作原理,每一個使用phplib的頁面首先必須可以找到運行phplib所必須類庫檔案,我們可以在php3.ini中設定auto_prepend變數來支援,phplib分發包中包含一個prepend.php3檔案,將auto_prepend指定"d:/apache/php/prepend.php3"(帶引號)後,各頁面就會自動包含phplib類庫,我們還可以將phplib類庫所在目錄加進include變數中,以便可以找到這些檔案,當然,最苯的辦法就是指定phplib的絕對路徑,這可不是個好主意,可移植性太差!

第二步,每一個使用phplib的頁面中,你必須首先調用page_open函數進行初始化。這會告訴phplib,你現在或將來會用到狀態儲存。一個典型的
page_open例子如下:

page_open(array("sess" => "Example_Session"));
?>

陣列變數(sess)用來初始化一些狀態儲存對象,注意:必須使用phplib內建名(sess),這些內建名是你在local.ini中所定義的,page_open函數必須在頁面內容輸出到瀏覽器之前被調用。php3指令碼最後應以page_close()結束,這將會將有關狀態資料寫回到資料庫中,如果你忘了的話,結果你應該能想到,哈哈,你的變數全丟了,可不要怪我沒告訴你...

因為phplib使用了Cookies來儲存狀態資訊,所以page_open()函數必須在頁面內容輸出到瀏覽器之前被調用, 這裡的頁面內容可以是任何HTML資訊或者空行,如果你發現了錯誤"Oops - SetCookie called after header has been sent",這表明在page_open()之前向瀏覽器輸出了些什麼,你要特別留意空行,因為非常難找到,典型的錯誤是在標記之間輸出了空行,你應檢查在local.inc和prepend.php3檔案中是否包含了空行,這也是一個非常容易出錯的地方。為了減少出錯的可能,我們可以這樣書寫初始化程式:
page_open(array("sess" => "Example_Session"));
?>

.....

第三步,具體使用。
當一個使用者訪問了該網站後,隨即使用者的session就開始了,如果使用者的瀏覽器支援cookie的話,將會建立一個session的id放入cookie,這個唯一的ID是由PHP3隨機產生,然後又用隨機種子字串進行md5加密過了的,這裡的cookie應該叫做session cookie,因為這個cookie是不會寫到使用者硬碟裡去的,當一個session期結束的時候,該cookie也被完結了。如果使用者瀏覽器不支援cookie的話,那麼 該session的id將會放入url鏈中,因為是加密過的,所以竊取了也沒用。session ID存放著使用者的有關資訊,如使用者已認證、認證到期時間、使用者權限,和其他一些你可能需要的資訊,方便我們取用。Session其實就是使用者一次會話的過程。Session並不是僅僅用來跟蹤使用者的註冊,實際上,它還可以有其它的使用場合,你可以用它來儲存任何你想要存貯的資訊,這些資訊可以在使用者隨後訪問的頁面中派上用場,當然前提是那些頁面要使用PHPLIB。方法很簡單,註冊一個變數後即可在隨後的頁面中使用它,直至session結束。方法:
register( "variable_name"); ?>

注意,這裡的variable_name不是變數值,而是變數名,可以先指定變數名,隨後再賦值。你在某個頁面中可以改變變數的值,隨後的頁面訪問該變數會得到改變後的值。變數的類型是多樣的,可以是一個字串,一個數字,一個數組。舉例來說明:

第一頁:
page_open(array("sess" => "Example_Session"));
$sess->register( "first"); //注意變數名前不需要加$
if (iset($firstname)) {
$first = $firstname;
}
.....
page_close();
?>

第二頁:
page_open();//開始session


echo $first;//看看效果

page_close();//儲存狀態資訊
?>

註冊完一個變數,當頁面最後調用page_close()函數後,各個session變數會被寫回到資料庫中。如果你忘記調用page_close()函數的話,變數就不會被寫回資料庫,將出現不可預知的後果。當變數被使用完畢,你不再需要用到時,可以調用以下函數將變數刪除:

page_open(array("sess" => "Example_Session"));
...
$sess->unregister( "variable_name");
...
page_close();
?>

PHPLIB 7.0中,使用了一種儲存結構,它允許你儲存session資料到資料庫中、共用記憶體中或者LDAP中。PHPLIB使用了資料庫類,這使得你有了更多的選擇,你可以選用oracle8,mysql,postgresql等等資料庫來儲存狀態資訊。

關於phplib中的其它功能以及有關session的其它函數的使用,你可以參看它帶的手冊,或上它的網站看線上文檔。它的老家在http://phplib.netuse.de/index.php3 。php4的session實現大都從phplib學來的,它也靠cookies儲存session id,用檔案系統儲存變數(預設情況下)。因此,它的session變數不能儲存對象(事實上能儲存對象內容,但沒有意義,因為它是儲存在磁碟上的,不是活的對象,充其量也就是對象屍體。)不過這點的限制不是太大,我們在大部分情況下都只需要儲存變數就行了。當然你也可以將session儲存在資料庫中,下一小節中我們會講到怎樣將session儲存在資料庫中。在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下設為你的目錄)
; 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時,在每頁中就可以不必調用session_start()函數了)
session.cookie_lifetime = 0 ; lifetime in seconds of cookie(設定 cookie 送到瀏覽器後的儲存時間,單位為秒。預設值為 0,表示直到瀏覽器關閉。)
; 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(定義序列化資料的標識,本功能只有 WDDX 模組或 PHP 內部使用。預設值為 php)
; php is the standard serializer of PHP
session.gc_probability = 1 ; percentual probability that the (設定每次臨時檔案開始處理 (gc, garbage collection) 處理機率。預設值為 1。 )
; 'garbage collection' process is started
; on every session initialization
session.gc_maxlifetime = 1440 ; after this number of seconds, stored(設定儲存session的臨時檔案被清除前的存活秒數)
; data will be seen as 'garbage' and
; cleaned up by the gc process
session.referer_check = ; check HTTP Referer to invalidate (決定參照到用戶端的Session 代碼是否要刪除。有時在安全或其它考慮時,會設定不刪除。預設值為 0。)
; externally stored URLs containing ids
session.entropy_length = 0 ; how many bytes to read from the file(設定 session 從高熵值資源讀取的位元。預設值為 0.)
session.entropy_file = ; specified here to create the session id(設定 session 代碼建立時,使用外部高熵值資源或檔案來建立,例如 UNIX 系統上的 /dev/random 或 /dev/urandom。 )
; session.entropy_length = 16
; session.entropy_file = /dev/urandom
session.cache_limiter = nocache ; set to { nocache,private,public } to (設定session緩衝限制)
; determine HTTP caching aspects
session.cache_expire = 180 ; document expires after n minutes(文檔有效期間,單位為分鐘)

在windows平台下,php4.01pl2以前的版本會出現設定session.save_path 後出錯的情況,這是php的一個bug,在php4.01pl2及以後已經修正了。如果你用以前的版本,你可以將session.save_path設為"./",或設為"/temp",並在你放置php指令碼的當前盤根目錄下建一個名為temp的目錄即可(我的php指令碼放在d:apachehtdocs下,則我在d:盤根目錄下建一名為temp的目錄)。
在php4中有關session的函數主要有以下這些:

session_start: 初始化session,需要用session的每一個頁面最開始處調用。
session_destroy: 結束 session,在需要結束session處調。
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 資料解碼。
session_encode: Session 資料加密。

通常情況下我們只需要調用三個函數即可。
即sesssion_start()、session_register()、session_is_registered()。
在需要用到session的每一頁的最開始處調用session_start()函數,
一個典型的使用session的頁面如下:


....

$var="hello";
session_register("var");//註冊$var變數,注意沒有$符號


if(session_is_registered("var"))//檢查變數是否註冊
echo "haha,註冊了!";
else
echo "sorry,還沒有註冊!";

?>


php4中session處理的定製

我們需要擴充6個函數,當然這些函數不需你去調用,對我們來說是透明的。

這幾個函數是:
sess_open($sess_path, $session_name);

這個函數被session處理常式調用來作初始化工作。需要傳給它的兩個參數是$sess_path,它對應你的php.ini檔案中的session.save_path選項;$session_name,它對應php.ini中的session.name 選項。它們具體怎樣工作,請看下面的例子。

sess_close();

這個函數在頁面結束執行並且session處理常式需要關閉時被調用。(注意,不要和sess_destory混淆了,它是用來結束session的)

sess_read($key);

這個函數在session處理常式讀取指定session索引值($key)時。
這個函數檢索並返回標識為$key的session資料.(注意:你不用擔心怎樣序列化和還原序列化資料,如果你不知道這是什麼意思,不要擔心它)

譯者註:序列化是將變數或對象在程式結束或需要時儲存在檔案中,在下次程式運行或需要時再
調入記憶體的技術,有別於只儲存資料的方法。

sess_write($key, $val);

這個函資料在session處理常式需要將資料儲存時調用,這種情況經常在你的程式結束時發生。它負責將資料儲存在下次能用sess_read($key)函數檢索的地方。

sess_destroy($key);

這個函數在需要消毀session時。它負責刪除session並且清除環境。


sess_gc($maxlifetime);
這個函數負責清理片段。在這種情況下,它負責刪除過時的session資料。session處理常式會偶爾調用它們。

現在我們已經清楚了我們提供的函數。

定製程式可以用mysql資料庫或DBM檔案儲存session資料。取決於你的需要。
如果你決定使用mysql作支援,那需要作以下工作:

首先我們在mysql中建立一個sessions資料庫,並且建立一個sessions表。先運行你的mysql用戶端並且執行下面的命令:
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* 變數使其匹配你機器上的資料庫設定。

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.