PHP中session使用方法詳解
更新時間:2007年03月16日 00:00:00 作者:
在PHP開發(fā)中對比起Cookie,session 是存儲在服務(wù)器端的會話,相對安全,并且不像 Cookie 那樣有存儲長度限制,本文簡單介紹 session 的使用
PHP中session詳解2
綜述
Session指的就是用戶在瀏覽某個網(wǎng)站時,從進入網(wǎng)站到瀏覽器關(guān)閉所經(jīng)過的這段時間,也就是用戶瀏覽這個網(wǎng)站所花費的時間。從上述的定義中我們可以看到,Session實際上是一個特定的時間概念。
一般來說,在網(wǎng)站上某一個頁面中的變量(指服務(wù)器端變量,下同)是不能在下一頁中用的,有了session就好辦了。session中注冊的變量可以作為全局變量使用。這樣我們就可以將session用于用戶身份認證,程序狀態(tài)記錄,頁面之間參數(shù)傳遞。
在PHP3版本中是如何實現(xiàn)session的?
php3本身是沒有實現(xiàn)session功能的,我們只有用其他的方法來實現(xiàn),這其中最有名的要算phplib了。phplib最基本的功能包括用戶認證、Session管理、權(quán)限及數(shù)據(jù)庫的抽象化。下面我們就講述一下如何用phplib實現(xiàn)session。
1、首先安裝phplib(環(huán)境為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的類庫需要根據(jù)系統(tǒng)進行初始化,可能需要修改local.inc文件,其中包含著一些基本參數(shù),可以根據(jù)自己機器的實際情況來進行修改。
將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數(shù)據(jù)庫所在主機名
var $Database = "test"; //數(shù)據(jù)庫名
var $User = "root"; //數(shù)據(jù)庫用戶名
var $Password = "1234567"; //數(shù)據(jù)庫用戶密碼
}
最后根據(jù)phplib目錄下的stuff子目錄中的create_database.mysql文件生成初始表。
由于每一個使用phplib的頁面首先必須可以找到運行phplib所必需的類庫文件,我們可以在php.ini中設(shè)置auto_prepend變量來支持,phplib中包含一個prepend.php文件,并將auto_prepend指定為"d:/Apache/php/prepend.php"(帶引號)后,各頁面就會自動包含phplib類庫,我們還可以將phplib類庫所在目錄加進include變量中,以便可以找到這些文件。
2、調(diào)用page_open()函數(shù)
在每一個使用phplib的頁面中,必須首先調(diào)用page_open函數(shù)進行初始化,例如:
復制代碼 代碼如下:
?。?php
page_open(array("sess" => "Test_Session"));
?>
數(shù)組變量(sess)用來初始化一些狀態(tài)保存對象,這里應(yīng)該注意:必須使用phplib內(nèi)置名(sess),這些內(nèi)置名是在local.inc中所定義的.。
因為phplib使用了Cookies來保存狀態(tài)信息,所以page_open()函數(shù)必須在頁面內(nèi)容輸出到瀏覽器之前被調(diào)用。php腳本最后應(yīng)以page_close()結(jié)束,這將會將有關(guān)狀態(tài)數(shù)據(jù)寫回到數(shù)據(jù)庫中,否則變量會丟失。
3、具體使用。
注冊一個變量后即可在隨后的頁面中使用它,直至session結(jié)束。方法:
<?php $sess->register( "varname"); ?>
注意,這里的varname不是變量值,而是變量名,可以先指定變量名,隨后再賦值。你在某個頁面中可以改變變量的值,隨后的頁面訪問該變量時會得到改變后的值。變量的類型是多樣的,可以是一個字符串,一個數(shù)字,一個數(shù)組。舉例來說明:
第一頁:
<?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();//保存狀態(tài)信息
?>
注冊完一個變量,當頁面最后調(diào)用page_close()函數(shù)后,各個session變量會被寫回到數(shù)據(jù)庫中。如果忘記調(diào)用page_close()函數(shù)的話,變量就不會被寫回數(shù)據(jù)庫,這樣將出現(xiàn)不可預知的后果。當變量被使用完畢,不再需要用到時,可以調(diào)用以下函數(shù)將變量刪除:
復制代碼 代碼如下:
<?php
page_open(array("sess" => "Test _Session"));
……
$sess->unregister( "variable_name");
……
page_close();
?>
在PHP4版本中是如何實現(xiàn)session的?
php4的session也靠cookies保存session id,用文件系統(tǒng)保存變量(默認情況下),因此,它的session變量不能保存對象。當然也可以將session保存在數(shù)據(jù)庫中。
在php4中有關(guān)session的函數(shù)很多(詳見php.ini配置一文),通常情況下我們只需要調(diào)用三個函數(shù)即可:sesssion_start()、session_register()、session_is_registered()。
在需要用到session的每一頁的最開始處調(diào)用session_start()函數(shù), 例如:
?。?session_start()?>
<html><body>
?。?
$welcome="hello world !";
session_register("welcome");//注冊$welcome變量,注意沒有$符號
if(session_is_registered("welcome"))//檢查$welcome變量是否注冊
echo "welcome變量已經(jīng)注冊了!";
else
echo "welcome變量還沒有注冊!";
?>
</body></html>
php4中session處理的定制
我們需要擴充6個函數(shù):
sess_open($sess_path, $session_name);
這個函數(shù)被session處理程序調(diào)用來作初始化工作。
參數(shù)$sess_path對應(yīng)php.ini文件中的session.save_path選項
參數(shù)$session_name對應(yīng)php.ini中的session.name 選項。
sess_close();
這個函數(shù)在頁面結(jié)束執(zhí)行并且session處理程序需要關(guān)閉時被調(diào)用
sess_read($key);
這個函數(shù)在session處理程序讀取指定session鍵值($key)時,檢索并返回標識為$key的session數(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)用它們。
定制程序可以用mysql數(shù)據(jù)庫或DBM文件保存session數(shù)據(jù),視具體的情況而定。如果使用mysql作支持,那還需要進行以下的步驟:
首先在mysql中創(chuàng)建一個sessions數(shù)據(jù)庫,并且創(chuàng)建一個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* 變量使其匹配你機器上的數(shù)據(jù)庫設(shè)置:
<?
$SESS_DBHOST = "localhost"; /* 數(shù)據(jù)庫主機名 */
$SESS_DBNAME = "sessions"; /* 數(shù)據(jù)庫名 */
$SESS_DBUSER = "phpsession"; /* 數(shù)據(jù)庫用戶名 */
$SESS_DBPASS = "phpsession"; /* 數(shù)據(jù)庫密碼 */
$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");
?>
定制使用dbm文件時的接口 :
<?
$SESS_DBM = "";
$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");
?>
session定制的測試代碼:
<?php
……
if ($handler == "dbm") include("session_dbm.php");//使用何種接口
elseif ($handler == "mysql") include("session_mysql.php");
else ……
session_start();
session_register("count");
……
?>
在身份驗證中,怎樣應(yīng)用Session?
Session可以用于用戶認證 :
驗證用戶是否合法:
?。?
session_start();
……//驗證過程
session_register("reguser");
?>
在另一頁面中檢查用戶是否登錄
?。?
session_start();
if(isset($reguser)&&$reguser!=""){//如果已經(jīng)登錄
echo "親愛的用戶,歡迎你";
}else{//如果沒有登錄
echo "請先注冊!";
}
?>
用戶退出登錄:
?。?
session_destroy();
……
?>
如何實現(xiàn)多session并發(fā)運行?
問題提出:我在為所在單位編寫一個進銷存系統(tǒng)中發(fā)現(xiàn)需要讓多個用戶可以同時進入一個php應(yīng)用程序。原來設(shè)計的靜態(tài)的唯一的session ID導致數(shù)據(jù)混亂。這樣,動態(tài)生成一個唯一的session ID成為當務(wù)之急。
解決辦法很簡單:我用了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的內(nèi)部變量名,因為他在session開始之前就已經(jīng)存在了。Mysessionname也不能用cookie方式存放,因為多個session肯定會覆蓋掉原先的cookie文件。你可以用隱含表單的域來保存它。這樣就不會有問題。
您可能感興趣的文章:
- PHP中使用Session配合Javascript實現(xiàn)文件上傳進度條功能
- PHP使用Session實現(xiàn)上傳進度功能詳解
- PHP實現(xiàn)提高SESSION響應(yīng)速度的幾種方法詳解
- PHP Session 變量的使用方法詳解與實例代碼
- PHP session有效期問題
- 詳解php設(shè)置session(過期、失效、有效期)
- PHP會話控制:Session與Cookie詳解
- PHP 文件上傳進度條的兩種實現(xiàn)方法的代碼
- php ajax實現(xiàn)文件上傳進度條
- PHP利用APC模塊實現(xiàn)文件上傳進度條的方法
- PHP實現(xiàn)帶進度條的Ajax文件上傳功能示例
- PHP基于session.upload_progress 實現(xiàn)文件上傳進度顯示功能詳解
相關(guān)文章
PHP基于正則批量替換Img中src內(nèi)容實現(xiàn)獲取縮略圖的功能示例
這篇文章主要介紹了PHP基于正則批量替換Img中src內(nèi)容實現(xiàn)獲取縮略圖的功能,涉及php針對頁面img元素的正則匹配與替換操作相關(guān)實現(xiàn)技巧,需要的朋友可以參考下2017-06-06php出現(xiàn)Cannot modify header information問題的解決方法大全
我做了一個統(tǒng)一的出錯提示函數(shù),在函數(shù)執(zhí)行里面,先處理出錯的地址寫入cookie以方便用戶登陸以后可以直接跳轉(zhuǎn)到要執(zhí)行的這個頁面,可是發(fā)現(xiàn)在服務(wù)器上測試時,竟然提示本地沒有出現(xiàn)的錯誤: Warning: Cannot modify header information - headers already sent by....2008-04-04