萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> php編程 >> PHP開發中session應用詳解

PHP開發中session應用詳解

   Session指的就是用戶在浏覽某個網站時,從進入網站到浏覽器關閉所經過的這段時間,也就是用戶浏覽這個網站所花費的時間。從上述的定義中我們可以看到,Session實際上是一個特定的時間概念。

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

  在PHP3版本中是如何實現session的?

  php3本身是沒有實現session功能的,我們只有用其他的方法來實現,這其中最有名的要算phplib了。phplib最基本的功能包括用戶認證、Session管理、權限及數據庫的抽象化。下面我們就講述一下如何用phplib實現session。

  1、首先安裝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:Apachehtdocs下。

  phplib的類庫需要根據系統進行初始化,可能需要修改local.inc文件,其中包含著一些基本參數,可以根據自己機器的實際情況來進行修改。

  將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數據庫所在主機名

  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變量中,以便可以找到這些文件。 2、調用page_open()函數

  在每一個使用phplib的頁面中,必須首先調用page_open函數進行初始化,例如:

  

  page_open(array("sess" => "Test_Session"));

  ?>

  數組變量(sess)用來初始化一些狀態保存對象,這裡應該注意:必須使用phplib內置名(sess),這些內置名是在local.inc中所定義的.。

  因為phplib使用了Cookies來保存狀態信息,所以page_open()函數必須在頁面內容輸出到浏覽器之前被調用。php腳本最後應以page_close()結束,這將會將有關狀態數據寫回到數據庫中,否則變量會丟失。

  3、具體使用。

  注冊一個變量後即可在隨後的頁面中使用它,直至session結束。方法:

  register( "varname"); ?>

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

  第一頁:

  

  page_open(array("sess" => "Test _Session"));

  $sess->register( "welcome"); //注冊變量$welcome,注意不需要加$

  $welcome="Hello,PHP world!";

  ……

  page_close();

  ?>

  第二頁:

  

  page_open();//開始session

  echo $welcome;//顯示第一頁中定義的$welcome

  page_close();//保存狀態信息

  ?>

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

  

  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()函數, 例如:

  

  

  

  $welcome="hello world !";

  session_register("welcome");//注冊$welcome變量,注意沒有$符號

  if(session_is_registered("welcome"))//檢查$welcome變量是否注冊

  echo "welcome變量已經注冊了!";

  else

  echo "welcome變量還沒有注冊!";

  ?>

  

  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* 變量使其匹配你機器上的數據庫設置:

  [1] [2] 下一頁

  

  $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&quo

copyright © 萬盛學電腦網 all rights reserved