亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術(shù)文章
文章詳情頁

PHP開發(fā)中session應(yīng)用詳解

瀏覽:2日期:2024-02-04 13:03:20

Session指的就是用戶在瀏覽某個網(wǎng)站時,從進(jìn)入網(wǎng)站到瀏覽器關(guān)閉所經(jīng)過的這段時間,也就是用戶瀏覽這個網(wǎng)站所花費(fèi)的時間。從上述的定義中我們可以看到,Session實(shí)際上是一個特定的時間概念。

一般來說,在網(wǎng)站上某一個頁面中的變量(指服務(wù)器端變量,下同)是不能在下一頁中用的,有了session就好辦了。session中注冊的變量可以作為全局變量使用。這樣我們就可以將session用于用戶身份認(rèn)證,程序狀態(tài)記錄,頁面之間參數(shù)傳遞。

在PHP3版本中是如何實(shí)現(xiàn)session的?

php3本身是沒有實(shí)現(xiàn)session功能的,我們只有用其他的方法來實(shí)現(xiàn),這其中最有名的要算phplib了。phplib最基本的功能包括用戶認(rèn)證、Session管理、權(quán)限及數(shù)據(jù)庫的抽象化。下面我們就講述一下如何用phplib實(shí)現(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:Apachehtdocs下。

phplib的類庫需要根據(jù)系統(tǒng)進(jìn)行初始化,可能需要修改local.inc文件,其中包含著一些基本參數(shù),可以根據(jù)自己機(jī)器的實(shí)際情況來進(jìn)行修改。

將d:Apachephpprepend.php文件中的一段程序改為如下樣子:

if (!isset($_PHPLIB) or !is_array($_PHPLIB)) { $_PHPLIB['libdir'] = 'd:/Apache/php/'; //放phplib下php目錄的路徑 };

修改d:Apachephplocal.inc文件:

class DB_Example extends DB_Sql { var $Host = 'localhost'; //mysql數(shù)據(jù)庫所在主機(jī)名 var $Database = 'test'; //數(shù)據(jù)庫名 var $User = 'root'; //數(shù)據(jù)庫用戶名 var $Password = '1234567'; //數(shù)據(jù)庫用戶密碼 };

最后根據(jù)phplib目錄下的stuff子目錄中的create_database.mysql文件生成初始表。

由于每一個使用phplib的頁面首先必須可以找到運(yùn)行phplib所必需的類庫文件,我們可以在php.ini中設(shè)置auto_prepend變量來支持,phplib中包含一個prepend.php文件,并將auto_prepend指定為'd:/Apache/php/prepend.php'(帶引號)后,各頁面就會自動包含phplib類庫,我們還可以將phplib類庫所在目錄加進(jìn)include變量中,以便可以找到這些文件。 2、調(diào)用page_open()函數(shù)

在每一個使用phplib的頁面中,必須首先調(diào)用page_open函數(shù)進(jìn)行初始化,例如:

<?php page_open(array('sess' => 'Test_Session')); ?>;

數(shù)組變量(sess)用來初始化一些狀態(tài)保存對象,這里應(yīng)該注意:必須使用phplib內(nèi)置名(sess),這些內(nèi)置名是在local.inc中所定義的.。

因?yàn)閜hplib使用了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)信息 ?>;

注冊完一個變量,當(dāng)頁面最后調(diào)用page_close()函數(shù)后,各個session變量會被寫回到數(shù)據(jù)庫中。如果忘記調(diào)用page_close()函數(shù)的話,變量就不會被寫回數(shù)據(jù)庫,這樣將出現(xiàn)不可預(yù)知的后果。當(dāng)變量被使用完畢,不再需要用到時,可以調(diào)用以下函數(shù)將變量刪除:

<?php  page_open(array('sess' => 'Test _Session'));  …… $sess->unregister( 'variable_name');  …… page_close(); ?>;

在PHP4版本中是如何實(shí)現(xiàn)session的?

php4的session也靠cookies保存session id,用文件系統(tǒng)保存變量(默認(rèn)情況下),因此,它的session變量不能保存對象。當(dāng)然也可以將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處理的定制

我們需要擴(kuò)充6個函數(shù):

·sess_open($sess_path, $session_name);

這個函數(shù)被session處理程序調(diào)用來作初始化工作。參數(shù)$sess_path對應(yīng)php.ini文件中的session.save_path選項(xiàng)參數(shù)$session_name對應(yīng)php.ini中的session.name 選項(xiàng)。

·sess_close();

這個函數(shù)在頁面結(jié)束執(zhí)行并且session處理程序需要關(guān)閉時被調(diào)用

·sess_read($key);

這個函數(shù)在session處理程序讀取指定session鍵值($key)時,檢索并返回標(biāo)識為$key的session數(shù)據(jù).(注意:序列化是將變量或?qū)ο笤诔绦蚪Y(jié)束或需要時保存在文件中,在下次程序運(yùn)行或需要時再調(diào)入內(nèi)存的技術(shù),有別于只保存數(shù)據(jù)的方法。)

·sess_write($key, $val);

這個函數(shù)據(jù)在session處理程序需要將數(shù)據(jù)保存時調(diào)用,這種情況經(jīng)常在程序結(jié)束時發(fā)生。它負(fù)責(zé)將數(shù)據(jù)保存在下次能用sess_read($key)函數(shù)檢索的地方。

·sess_destroy($key);

這個函數(shù)在需要消毀session時。它負(fù)責(zé)刪除session并且清除環(huán)境。

·sess_gc($maxlifetime);

這個函數(shù)負(fù)責(zé)清理碎片。在這種情況下,它負(fù)責(zé)刪除過時的session數(shù)據(jù)。session處理程序會偶爾調(diào)用它們。

定制程序可以用mysql數(shù)據(jù)庫或DBM文件保存session數(shù)據(jù),視具體的情況而定。如果使用mysql作支持,那還需要進(jìn)行以下的步驟:

首先在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* 變量使其匹配你機(jī)器上的數(shù)據(jù)庫設(shè)置:

<?$SESS_DBHOST = 'localhost'; /* 數(shù)據(jù)庫主機(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àn)證中,怎樣應(yīng)用Session?

Session可以用于用戶認(rèn)證 :

驗(yàn)證用戶是否合法:

<?  session_start();  ……//驗(yàn)證過程 session_register('reguser'); ?>;

在另一頁面中檢查用戶是否登錄

<?  session_start();  if(isset($reguser)&&$reguser!=''){//如果已經(jīng)登錄 echo '親愛的用戶,歡迎你';  }else{//如果沒有登錄 echo '請先注冊!';  }?>;

用戶退出登錄:

<?  session_destroy();  ……?>;

如何實(shí)現(xiàn)多session并發(fā)運(yùn)行?

問題提出:我在為所在單位編寫一個進(jìn)銷存系統(tǒng)中發(fā)現(xiàn)需要讓多個用戶可以同時進(jìn)入一個php應(yīng)用程序。原來設(shè)計(jì)的靜態(tài)的唯一的session ID導(dǎo)致數(shù)據(jù)混亂。這樣,動態(tài)生成一個唯一的session ID成為當(dāng)務(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)部變量名,因?yàn)樗趕ession開始之前就已經(jīng)存在了。Mysessionname也不能用cookie方式存放,因?yàn)槎鄠€session肯定會覆蓋掉原先的cookie文件。你可以用隱含表單的域來保存它。這樣就不會有問題。

標(biāo)簽: PHP
主站蜘蛛池模板: 国产精品 视频一区 二区三区 | 九九精品激情在线视频 | 香蕉eeww99国产在线观看 | 久操久热| 国产成人综合亚洲一区 | 曰本女人一级毛片看一级毛 | 国产精品19禁在线观看2021 | 欧美一区二区三区国产精品 | 中文字幕日韩高清版毛片 | 欧美曰b| 国产精品亚洲片在线va | 性欧美视频在线观看 | 日本特黄特黄特刺激大片 | 一级生活黄色片 | 成人毛片18女人毛片免费视频未 | 久久免费精彩视频 | 国产特级毛片aaaaaaa高清 | 黑人激情视频 | 又黄又爽又猛午夜性色播在线播放 | 欧美精品久久久久久久免费观看 | 欧美日韩大片 | 污污网站免费 | 久久综合偷拍 | 91日本在线精品高清观看 | 午夜黄色 | 情趣色视频网站 | 成人无遮挡免费网站视频在线观看 | 国产片一级特黄aa的大片 | 成年人午夜免费视频 | 一级片久久| 欧美片免费观看网址 | 一级黄色录像免费观看 | 精品精品国产高清a毛片牛牛 | 日本高清毛片视频在线看 | 麻豆视频免费看 | 亚洲中国日本韩国美国毛片 | 欧美成人免费草草影院视频 | 精品无码久久久久久国产 | 黄大片日本一级在线a | 久久精品亚洲精品国产色婷 | 国内精品久久久久久影院老狼 |