欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PHP中session使用方法詳解第2/2頁(yè)

 更新時(shí)間:2007年03月16日 00:00:00   作者:  
在PHP開發(fā)中對(duì)比起Cookie,session 是存儲(chǔ)在服務(wù)器端的會(huì)話,相對(duì)安全,并且不像 Cookie 那樣有存儲(chǔ)長(zhǎng)度限制,本文簡(jiǎn)單介紹 session 的使用


PHP中session詳解2

  綜述
  Session指的就是用戶在瀏覽某個(gè)網(wǎng)站時(shí),從進(jìn)入網(wǎng)站到瀏覽器關(guān)閉所經(jīng)過(guò)的這段時(shí)間,也就是用戶瀏覽這個(gè)網(wǎng)站所花費(fèi)的時(shí)間。從上述的定義中我們可以看到,Session實(shí)際上是一個(gè)特定的時(shí)間概念。
  一般來(lái)說(shuō),在網(wǎng)站上某一個(gè)頁(yè)面中的變量(指服務(wù)器端變量,下同)是不能在下一頁(yè)中用的,有了session就好辦了。session中注冊(cè)的變量可以作為全局變量使用。這樣我們就可以將session用于用戶身份認(rèn)證,程序狀態(tài)記錄,頁(yè)面之間參數(shù)傳遞。

  在PHP3版本中是如何實(shí)現(xiàn)session的?
  php3本身是沒(méi)有實(shí)現(xiàn)session功能的,我們只有用其他的方法來(lái)實(shí)現(xiàn),這其中最有名的要算phplib了。phplib最基本的功能包括用戶認(rèn)證、Session管理、權(quán)限及數(shù)據(jù)庫(kù)的抽象化。下面我們就講述一下如何用phplib實(shí)現(xiàn)session。

  1、首先安裝phplib(環(huán)境為win2000+php3.0.16+Apache1.3.12+phplib7.2c+mysql3.23.21 for win32)

  首先將phplib解開,里面有一個(gè)"php"目錄,將這個(gè)目錄拷貝到Apache的安裝目錄下。例如:Apache安裝在d:\Apache 目錄下,那么就將"php"目錄拷貝到d:\Apache,并將phplib目錄的pages目錄下(不包括目錄本身)的文件和目錄一起拷貝到d:\Apache\htdocs下。

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

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

復(fù)制代碼 代碼如下:

    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ù)庫(kù)所在主機(jī)名
      var $Database = "test"; //數(shù)據(jù)庫(kù)名
      var $User = "root"; //數(shù)據(jù)庫(kù)用戶名
      var $Password = "1234567"; //數(shù)據(jù)庫(kù)用戶密碼
    }


  最后根據(jù)phplib目錄下的stuff子目錄中的create_database.mysql文件生成初始表。
  由于每一個(gè)使用phplib的頁(yè)面首先必須可以找到運(yùn)行phplib所必需的類庫(kù)文件,我們可以在php.ini中設(shè)置auto_prepend變量來(lái)支持,phplib中包含一個(gè)prepend.php文件,并將auto_prepend指定為"d:/Apache/php/prepend.php"(帶引號(hào))后,各頁(yè)面就會(huì)自動(dòng)包含phplib類庫(kù),我們還可以將phplib類庫(kù)所在目錄加進(jìn)include變量中,以便可以找到這些文件。

2、調(diào)用page_open()函數(shù)

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

復(fù)制代碼 代碼如下:

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

數(shù)組變量(sess)用來(lái)初始化一些狀態(tài)保存對(duì)象,這里應(yīng)該注意:必須使用phplib內(nèi)置名(sess),這些內(nèi)置名是在local.inc中所定義的.。
  因?yàn)閜hplib使用了Cookies來(lái)保存狀態(tài)信息,所以page_open()函數(shù)必須在頁(yè)面內(nèi)容輸出到瀏覽器之前被調(diào)用。php腳本最后應(yīng)以page_close()結(jié)束,這將會(huì)將有關(guān)狀態(tài)數(shù)據(jù)寫回到數(shù)據(jù)庫(kù)中,否則變量會(huì)丟失。

  3、具體使用。

  注冊(cè)一個(gè)變量后即可在隨后的頁(yè)面中使用它,直至session結(jié)束。方法:
   ?。?php $sess->register( "varname"); ?>
  注意,這里的varname不是變量值,而是變量名,可以先指定變量名,隨后再賦值。你在某個(gè)頁(yè)面中可以改變變量的值,隨后的頁(yè)面訪問(wèn)該變量時(shí)會(huì)得到改變后的值。變量的類型是多樣的,可以是一個(gè)字符串,一個(gè)數(shù)字,一個(gè)數(shù)組。舉例來(lái)說(shuō)明:
  第一頁(yè):
    <?php
    page_open(array("sess" => "Test _Session"));
    $sess->register( "welcome"); //注冊(cè)變量$welcome,注意不需要加$
    $welcome="Hello,PHP world!";
    ……
    page_close();
    ?>
  第二頁(yè):
   ?。?php
    page_open();//開始session
    echo $welcome;//顯示第一頁(yè)中定義的$welcome
    page_close();//保存狀態(tài)信息
    ?>
  注冊(cè)完一個(gè)變量,當(dāng)頁(yè)面最后調(diào)用page_close()函數(shù)后,各個(gè)session變量會(huì)被寫回到數(shù)據(jù)庫(kù)中。如果忘記調(diào)用page_close()函數(shù)的話,變量就不會(huì)被寫回?cái)?shù)據(jù)庫(kù),這樣將出現(xiàn)不可預(yù)知的后果。當(dāng)變量被使用完畢,不再需要用到時(shí),可以調(diào)用以下函數(shù)將變量刪除:

復(fù)制代碼 代碼如下:

    <?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變量不能保存對(duì)象。當(dāng)然也可以將session保存在數(shù)據(jù)庫(kù)中。
  在php4中有關(guān)session的函數(shù)很多(詳見(jiàn)php.ini配置一文),通常情況下我們只需要調(diào)用三個(gè)函數(shù)即可:sesssion_start()、session_register()、session_is_registered()。
  在需要用到session的每一頁(yè)的最開始處調(diào)用session_start()函數(shù), 例如:
   ?。?session_start()?>
   ?。糷tml><body>
   ?。?
    $welcome="hello world !";
    session_register("welcome");//注冊(cè)$welcome變量,注意沒(méi)有$符號(hào)
    if(session_is_registered("welcome"))//檢查$welcome變量是否注冊(cè)
      echo "welcome變量已經(jīng)注冊(cè)了!";
    else
      echo "welcome變量還沒(méi)有注冊(cè)!";
    ?>
   ?。?body></html>
  php4中session處理的定制
  我們需要擴(kuò)充6個(gè)函數(shù):
    sess_open($sess_path, $session_name);
    這個(gè)函數(shù)被session處理程序調(diào)用來(lái)作初始化工作。
    參數(shù)$sess_path對(duì)應(yīng)php.ini文件中的session.save_path選項(xiàng)
    參數(shù)$session_name對(duì)應(yīng)php.ini中的session.name 選項(xiàng)。
    sess_close();
    這個(gè)函數(shù)在頁(yè)面結(jié)束執(zhí)行并且session處理程序需要關(guān)閉時(shí)被調(diào)用
    sess_read($key);
    這個(gè)函數(shù)在session處理程序讀取指定session鍵值($key)時(shí),檢索并返回標(biāo)識(shí)為$key的session數(shù)據(jù).(注意:序列化是將變量或?qū)ο笤诔绦蚪Y(jié)束或需要時(shí)保存在文件中,在下次程序運(yùn)行或需要時(shí)再調(diào)入內(nèi)存的技術(shù),有別于只保存數(shù)據(jù)的方法。)
    sess_write($key, $val);
    這個(gè)函數(shù)據(jù)在session處理程序需要將數(shù)據(jù)保存時(shí)調(diào)用,這種情況經(jīng)常在程序結(jié)束時(shí)發(fā)生。它負(fù)責(zé)將數(shù)據(jù)保存在下次能用sess_read($key)函數(shù)檢索的地方。
    sess_destroy($key);
    這個(gè)函數(shù)在需要消毀session時(shí)。它負(fù)責(zé)刪除session并且清除環(huán)境。
    sess_gc($maxlifetime);
    這個(gè)函數(shù)負(fù)責(zé)清理碎片。在這種情況下,它負(fù)責(zé)刪除過(guò)時(shí)的session數(shù)據(jù)。session處理程序會(huì)偶爾調(diào)用它們。
  定制程序可以用mysql數(shù)據(jù)庫(kù)或DBM文件保存session數(shù)據(jù),視具體的情況而定。如果使用mysql作支持,那還需要進(jìn)行以下的步驟:
  首先在mysql中創(chuàng)建一個(gè)sessions數(shù)據(jù)庫(kù),并且創(chuàng)建一個(gè)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ù)庫(kù)設(shè)置:
<?
$SESS_DBHOST = "localhost"; /* 數(shù)據(jù)庫(kù)主機(jī)名 */
$SESS_DBNAME = "sessions"; /* 數(shù)據(jù)庫(kù)名 */
$SESS_DBUSER = "phpsession"; /* 數(shù)據(jù)庫(kù)用戶名 */
$SESS_DBPASS = "phpsession"; /* 數(shù)據(jù)庫(kù)密碼 */
$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文件時(shí)的接口 :
<?
$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定制的測(cè)試代碼:
<?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)證過(guò)程
    session_register("reguser");
    ?>
 在另一頁(yè)面中檢查用戶是否登錄
   ?。?
    session_start();
    if(isset($reguser)&&$reguser!=""){//如果已經(jīng)登錄
      echo "親愛(ài)的用戶,歡迎你";
    }else{//如果沒(méi)有登錄
      echo "請(qǐng)先注冊(cè)!";
    }
    ?>
  用戶退出登錄:
    <?
    session_destroy();
    ……
    ?>
  如何實(shí)現(xiàn)多session并發(fā)運(yùn)行?
  問(wèn)題提出:我在為所在單位編寫一個(gè)進(jìn)銷存系統(tǒng)中發(fā)現(xiàn)需要讓多個(gè)用戶可以同時(shí)進(jìn)入一個(gè)php應(yīng)用程序。原來(lái)設(shè)計(jì)的靜態(tài)的唯一的session ID導(dǎo)致數(shù)據(jù)混亂。這樣,動(dòng)態(tài)生成一個(gè)唯一的session ID成為當(dāng)務(wù)之急。
  解決辦法很簡(jiǎn)單:我用了php文件名+時(shí)間戳為唯一的session ID,這樣在我的程序中的每個(gè)session就各就各位,不再混亂了。
  下面把我的源代碼公布,方便也有同樣的問(wèn)題的朋友多一個(gè)解決方法。
//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為頁(yè)面間唯一的sessionname傳遞變量,如果你也用到這個(gè)名字必須把上述程序做個(gè)小小的改動(dòng)。Mysessionname不能為session的內(nèi)部變量名,因?yàn)樗趕ession開始之前就已經(jīng)存在了。Mysessionname也不能用cookie方式存放,因?yàn)槎鄠€(gè)session肯定會(huì)覆蓋掉原先的cookie文件。你可以用隱含表單的域來(lái)保存它。這樣就不會(huì)有問(wèn)題。

相關(guān)文章

  • 微信公眾平臺(tái)之快遞查詢功能用法實(shí)例

    微信公眾平臺(tái)之快遞查詢功能用法實(shí)例

    這篇文章主要介紹了微信公眾平臺(tái)之快遞查詢功能用法,實(shí)例分析了微信公眾平臺(tái)實(shí)現(xiàn)快遞查詢的相關(guān)技巧與具體用法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-04-04
  • PHP基于正則批量替換Img中src內(nèi)容實(shí)現(xiàn)獲取縮略圖的功能示例

    PHP基于正則批量替換Img中src內(nèi)容實(shí)現(xiàn)獲取縮略圖的功能示例

    這篇文章主要介紹了PHP基于正則批量替換Img中src內(nèi)容實(shí)現(xiàn)獲取縮略圖的功能,涉及php針對(duì)頁(yè)面img元素的正則匹配與替換操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-06-06
  • PHP常用函數(shù)和常見(jiàn)疑難問(wèn)題解答

    PHP常用函數(shù)和常見(jiàn)疑難問(wèn)題解答

    雖然PHP在整體功能上不如Java強(qiáng)大,但相比PHP而言Java算是較重量級(jí)的,所以在小中型系統(tǒng)的開發(fā)上,使用PHP的趨勢(shì)不可擋,就算是大型網(wǎng)站,比如淘寶也部分使用了PHP(Java后臺(tái)邏輯+PHP前臺(tái)展示),所以趕緊開始學(xué)PHP啦
    2014-03-03
  • nginx下安裝php7+php5

    nginx下安裝php7+php5

    本文給大家分享的是在nginx下安裝php7,并且實(shí)現(xiàn)與php5共存,非常的實(shí)用,有需要的小伙伴可以參考下
    2016-07-07
  • php中socket的用法詳解

    php中socket的用法詳解

    這篇文章主要介紹了php中socket的用法,詳細(xì)講述了PHP進(jìn)行socket通信的完整步驟,非常具有參考借鑒價(jià)值,需要的朋友可以參考下
    2014-10-10
  • 如何寫php程序?

    如何寫php程序?

    如何寫php程序?...
    2006-12-12
  • Zend framework處理一個(gè)http請(qǐng)求的流程分析

    Zend framework處理一個(gè)http請(qǐng)求的流程分析

    Zend framework處理一個(gè)http請(qǐng)求的流程分析,有助于大家提高知識(shí)面。
    2010-02-02
  • php出現(xiàn)Cannot modify header information問(wèn)題的解決方法大全

    php出現(xiàn)Cannot modify header information問(wèn)題的解決方法大全

    我做了一個(gè)統(tǒng)一的出錯(cuò)提示函數(shù),在函數(shù)執(zhí)行里面,先處理出錯(cuò)的地址寫入cookie以方便用戶登陸以后可以直接跳轉(zhuǎn)到要執(zhí)行的這個(gè)頁(yè)面,可是發(fā)現(xiàn)在服務(wù)器上測(cè)試時(shí),竟然提示本地沒(méi)有出現(xiàn)的錯(cuò)誤: Warning: Cannot modify header information - headers already sent by....
    2008-04-04
  • 淺談PHP設(shè)計(jì)模式之對(duì)象池模式Pool

    淺談PHP設(shè)計(jì)模式之對(duì)象池模式Pool

    對(duì)象池模式是一種提前準(zhǔn)備了一組已經(jīng)初始化了的對(duì)象『池』而不是按需創(chuàng)建或者銷毀的創(chuàng)建型設(shè)計(jì)模式。對(duì)象池客戶端會(huì)向?qū)ο蟪刂姓?qǐng)求一個(gè)對(duì)象,然后使用這個(gè)返回的對(duì)象執(zhí)行相關(guān)操作。當(dāng)客戶端使用完畢,它將把這個(gè)特定類型的工廠對(duì)象返回給對(duì)象池,而不是銷毀掉這個(gè)對(duì)象。
    2021-05-05
  • php常用表單驗(yàn)證類用法實(shí)例

    php常用表單驗(yàn)證類用法實(shí)例

    這篇文章主要介紹了php常用表單驗(yàn)證類用法,實(shí)例分析了php針對(duì)表單元素常用驗(yàn)證技巧,需要的朋友可以參考下
    2015-06-06

最新評(píng)論