php裏session的用法(超級經典)php
綜述
Session指的就是用戶在瀏覽某個網站時,從進入網站到瀏覽器關閉所通過的這段時間,也就是用戶瀏覽這個網站所花費的時間。從上述的定義中咱們能夠看到,Session其實是一個特定的時間概念。
通常來講,在網站上某一個頁面中的變量(指服務器端變量,下同)是不能在下一頁中用的,有了session就好辦了。session中註冊的變量能夠做爲全局變量使用。這樣咱們就能夠將session用於用戶身份認證,程序狀態記錄,頁面之間參數傳遞。
在PHP3版本中是如何實現session的?
php3自己是沒有實現session功能的,咱們只有用其餘的方法來實現,這其中最有名的要算phplib了。phplib最基本的功能包括用戶認證、Session管理、權限及數據庫的抽象化。html
下面咱們就講述一下如何用phplib實sessionmysql
VGGGGhttp://hiphotos.baidu.com/sunrat/pic/item/b1b5ab0635fae6cd4e8294fe0fb30f2443a70f9d.jpgGGGGsql
一、首先安裝phplib(環境爲win2000+php3.0.16+Apache1.3.12+phplib7.2c+mysql3.23.21 for win32)
首先將phplib解開,裏面有一個"php"目錄,將這個目錄拷貝到Apache的安裝目錄下。例如:Apache安裝在d:\Apache 目錄下,那麼就將"php"目錄拷貝到d:\Apache,並將phplib目錄的pages目錄下(不包括目錄自己)的文件和目錄一塊兒拷貝到d:\Apache\htdocs下。
phplib的類庫須要根據系統進行初始化,可能須要修改local.inc文件,其中包含着一些基本參數,能夠根據本身機器的實際狀況來進行修改。
將d:\Apache\php\prepend.php文件中的一段程序改成以下樣子:
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 = "1234567"; //數據庫用戶密碼
}
最後根據phplib目錄下的stuff子目錄中的create_database.mysql文件生成初始表。
因爲每個使用phplib的頁面首先必須能夠找到運行phplib所必需的類庫文件,咱們能夠在php.ini中設置auto_prepend變量來支持,phplib中包含一個prepend.php文件,並將auto_prepend指定爲"d:/Apache/php/prepend.php"(帶引號)後,各頁面就會自動包含phplib類庫,咱們還能夠將phplib類庫所在目錄加進include變量中,以即可以找到這些文件。
二、調用page_open()函數
在每個使用phplib的頁面中,必須首先調用page_open函數進行初始化,例如:
<?php
page_open(array("sess" => "Test_Session"));
?>
數組變量(sess)用來初始化一些狀態保存對象,這裏應該注意:必須使用phplib內置名(sess),這些內置名是在local.inc中所定義的.。
由於phplib使用了Cookies來保存狀態信息,因此page_open()函數必須在頁面內容輸出到瀏覽器以前被調用。php腳本最後應以page_close()結束,這將會將有關狀態數據寫回到數據庫中,不然變量會丟失。
三、具體使用。
註冊一個變量後便可在隨後的頁面中使用它,直至session結束。方法:
<?php $sess->register( "varname"); ?>
注意,這裏的varname不是變量值,而是變量名,能夠先指定變量名,隨後再賦值。你在某個頁面中能夠改變變量的值,隨後的頁面訪問該變量時會獲得改變後的值。變量的類型是多樣的,能夠是一個字符串,一個數字,一個數組。舉例來講明:
第一頁:
<?php
page_open(array("sess" => "Test _Session"));
$sess->register( "welcome"); //註冊變量$welcome,注意不須要加$
$welcome="Hello,PHP world!";
……
page_close();
?>
第二頁:
<?php
page_open();//開始session
echo $welcome;//顯示第一頁中定義的$welcome
page_close();//保存狀態信息
?>
註冊完一個變量,當頁面最後調用page_close()函數後,各個session變量會被寫回到數據庫中。若是忘記調用page_close()函數的話,變量就不會被寫回數據庫,這樣將出現不可預知的後果。當變量被使用完畢,再也不須要用到時,能夠調用如下函數將變量刪除:
<?php
page_open(array("sess" => "Test _Session"));
……
$sess->unregister( "variable_name");
……
page_close();
?>
在PHP4版本中是如何實現session的?
php4的session也靠cookies保存session id,用文件系統保存變量(默認狀況下),所以,它的session變量不能保存對象。固然也能夠將session保存在數據庫中。
在php4中有關session的函數不少(詳見php.ini配置一文),一般狀況下咱們只須要調用三個函數便可:sesssion_start()、session_register()、session_is_registered()。
在須要用到session的每一頁的最開始處調用session_start()函數, 例如:
<?session_start()?>
<html><body>
<?
$welcome="hello world !";
session_register("welcome");//註冊$welcome變量,注意沒有$符號
if(session_is_registered("welcome"))//檢查$welcome變量是否註冊
echo "welcome變量已經註冊了!";
else
echo "welcome變量尚未註冊!";
?>
</body></html>
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_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> 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* 變量使其匹配你機器上的數據庫設置:
<?
$SESS_DBHOST = "localhost"; /* 數據庫主機名 */
$SESS_DBNAME = "sessions"; /* 數據庫名 */
$SESS_DBUSER = "phpsession"; /* 數據庫用戶名 */
$SESS_DBPASS = "phpsession"; /* 數據庫密碼 */
$SESS_DBH = "";
$SESS_LIFE = get_cfg_var("session.gc_maxlifetime");
……//定製函數
session_set_save_handler( "sess_open", "sess_close", "sess_read", "sess_write", "sess_destroy", "sess_gc");
?>
定製使用dbm文件時的接口 :
<?
$SESS_DBM = "";
$SESS_LIFE = get_cfg_var("session.gc_maxlifetime");
……//定製函數
session_set_save_handler("sess_open", "sess_close", "sess_read", "sess_write", "sess_destroy", "sess_gc");
?>
session定製的測試代碼:
<?php
……
if ($handler == "dbm") include("session_dbm.php");//使用何種接口
elseif ($handler == "mysql") include("session_mysql.php");
else ……
session_start();
session_register("count");
……
?>
在身份驗證中,怎樣應用Session?
Session能夠用於用戶認證 :
驗證用戶是否合法:
<?
session_start();
……//驗證過程
session_register("reguser");
?>
在另外一頁面中檢查用戶是否登陸
<?
session_start();
if(isset($reguser)&&$reguser!=""){//若是已經登陸
echo "親愛的用戶,歡迎你";
}else{//若是沒有登陸
echo "請先註冊!";
}
?>
用戶退出登陸:
<?
session_destroy();
……
?>
如何實現多session併發運行?
問題提出:我在爲所在單位編寫一個進銷存系統中發現須要讓多個用戶能夠同時進入一個php應用程序。原來設計的靜態的惟一的session ID致使數據混亂。這樣,動態生成一個惟一的session ID成爲當務之急。
解決辦法很簡單:我用了php文件名+時間戳爲惟一的session ID,這樣在個人程序中的每一個session就各就各位,再也不混亂了。
下面把個人源代碼公佈,方便也有一樣的問題的朋友多一個解決方法。
//Start a PHP session to preserve variables.
if ( empty($mysessionname) ) {
$micro = microtime();
$micro = str_replace(" ","",$micro); // strip out the blanks
$micro = str_replace(".","",$micro); // strip out the periods
$mysessionname = "po_maint" . $micro;
}
session_name($mysessionname);
session_start();
程序註釋:
用mysessionname爲頁面間惟一的sessionname傳遞變量,若是你也用到這個名字必須把上述程序作個小小的改動。Mysessionname不能爲session的內部變量名,由於他在session開始以前就已經存在了。Mysessionname也不能用cookie方式存放,由於多個session確定會覆蓋掉原先的cookie文件。你能夠用隱含表單的域來保存它。這樣就不會有問題。
數據庫