首頁 > php教程 > PHP开发 > 主體

PHP中session使用方法詳解第2/2頁

高洛峰
發布: 2016-12-24 09:27:49
原創
1326 人瀏覽過

PHP中session詳解2

  綜述 
  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) 

  到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:\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變數中,以便可以找到這些檔案。

2、呼叫page_open()函數 

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

  <?php 
  page_open(array("sess" => "Test_Session")); 
  ?>
登入後複製

數組變數(sess)用這裡初始化一些狀態保存物件,這裡應該注意:必須使用phplib內建名(sess),這些內建名是在local.inc中所定義的.。 
  因為phplib使用了Cookies來保存狀態資訊,所以page_open()函數必須在頁面內容輸出到瀏覽器之前被呼叫。 php腳本最後應以page_close()結束,這將會將有關狀態資料寫回資料庫,否則變數會遺失。 

  3、具體使用。 

  註冊一個變數後即可在隨後的頁面中使用它,直到session結束。方法: 
    <?php $sess->register( "varname"); ?> 
  注意,這裡的varname不是變數值,而是變數名,可以先指定變數名,然後再賦值。你在某個頁面中可以改變變數的值,隨後的頁面訪問該變數時會得到改變後的值。變數的型別是多樣的,可以是一個字串,一個數字,一個陣列。舉例說明: 
  第一頁: 
    <?php 
    page_open(array("sess" => "Test _Session"); ; //註冊變數$welcome,注意不需要加上$ 
    $welcome="Hello,PHP world!"; 
    … 
    page_close(); 
    page_close();
    <?php 
    page_open();//開始session 
    echo $welcome; //顯示第一頁定義的$welcome 
    page_close();//儲存狀態資訊 
    ?> 
  註冊完一個變數,當頁面被寫入最後一個變數。如果忘記呼叫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_register("reguser"); 
    ?> 
 在另一頁中檢查使用者是否登入
    <? 
    session_start(); 
    if(isset($user)&&$ user=""){/歡迎你如果已經愛的; 
    }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(); out the blanks 
     $micro = str_replace(".","",$micro); // strip out the periods 
     〔$po_ "po_int" . mysessionname); 
  session_start(); 
程式註: 
  用mysessionname為頁間唯一的sessionname傳遞變量,如果你也用到這個名字必須把上述程式做個小小的改動。 Mysessionname不能為session的內部變數名,因為他在session開始之前就已經存在了。 Mysessionname也不能用cookie方式存放,因為多個session一定會覆寫原來的cookie檔。你可以用隱含表單的網域來保存它。這樣就不會出問題。





更多PHP中session使用方法詳解第2/2頁相關文章請關注PHP中文網!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門推薦
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板