All articles| All Pictures| All Softwares| All Video| Go home page| Write articles| Upload pictures

Reading number is top 10 articles
详细学习PHP的日期时间函数date()_php资料_编程技术
动态控件添加终极解决方案_[Asp.Net教程]
使用ASP.NET,2.0中的ReportViewer控件_[Asp.Net教程]
使用PHP程序来保护你的flash作品_php资料_编程技术
asp.net2.0服务器控件SiteMapPath的功能
按实际要求格式化显示DataGrid中字段值的方法_[Asp.Net教程]
在,GridView,中增加记录的方法_[Asp.Net教程]
组件编程之TypeConverterAttribute_[Asp.Net教程]
如何把fla文件输出成和swf一样的gif文件_[Html教程]
PHP学习宝典-第二章 (续篇)_[PHP教程]
Reading number is top 10 pictures
9.3阅兵全景图4-陸海空现代化兵种方阵梯队
So beauty, will let you spray blood2
2013中国四川省高考作文
一万二一支的万珂,用得真心肉疼。
Ashlynn Brooke show proud chest measurement3
Beautiful vacuum girl3
The Soviet union swimsuit exposure in the 70 year2
Kim jong il's mistress, national beauty JinYuJi actor3
泳装名模阿尔贝特妮写真
Lewd,it is too lewd.
Download software ranking
功夫熊猫2(上集)
Boxer's Top ten classic battle1
Sora aoi, the nurse, uniform ,nursing assistant
Boxer vs Yellow1
Tram sex maniac 2 (H) rar bag16
Tram sex maniac 2 (H) rar bag6
Be there or be square
Unix video tutorial15
Such love down(擒爱记)
Boxer's Top ten classic battle5
归海一刀 published in(发表于) 2014/2/10 6:46:45 Edit(编辑)
PHP中session详解_[PHP教程]

PHP中session详解_[PHP教程]

PHP中session详解_[PHP教程]

综述

  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:\Apache\htdocs下。

  phplib的类库需要根据系统进行初始化,可能需要修改local.inc文件,其中包含着一些基本参数,可以根据自己机器的实际情况来进行修改。


  将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数据库所在主机名
      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"));
    sess->register( "welcome"); //注册变量welcome,注意不需要加
    welcome="Hello,PHP world!";
    ……
    page_close();
    ?>

  第二页:


    <?php
    page_open();//开始session
    echo welcome;//显示第一页中定义的welcome
    page_close();//保存状态信息
    ?>

  注册完一个变量,当页面最后调用page_close()函数后,各个session变量会被写回到数据库中。如果忘记调用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_start();
    ……//验证过程
    session_register("reguser");
    ?>


  在另一页面中检查用户是否登录


    <?
    session_start();
    if(isset(reguser)&&reguser!=""){//如果已经登录
      echo "亲爱的用户,欢迎你";
    }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();
     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的内部变量名,因为他在session开始之前就已经存在了。Mysessionname也不能用cookie方式存放,因为多个session肯定会覆盖掉原先的cookie文件。你可以用隐含表单的域来保存它。这样就不会有问题。





添加到del.icio.us 添加到新浪ViVi 添加到百度搜藏 添加到POCO网摘 添加到天天网摘365Key 添加到和讯网摘 添加到天极网摘 添加到黑米书签 添加到QQ书签 添加到雅虎收藏 添加到奇客发现 diigo it 添加到饭否 添加到飞豆订阅 添加到抓虾收藏 添加到鲜果订阅 digg it 貼到funP 添加到有道阅读 Live Favorites 添加到Newsvine 打印本页 用Email发送本页 在Facebook上分享


Disclaimer Privacy Policy About us Site Map

If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)
Copyright ©2011-
uuhomepage.com, Inc. All rights reserved.