您的位置:网站主页> PHP教程> PHP SESSION讲解 > PHP3版本中是如何实现session php session讲解应用

PHP3版本中是如何实现session php session讲解应用

时间:2013-04-02 08:23:59   编辑:一切随缘   文章来源:php教程网 已阅读:256 次

编程入门教程[www.ask186.com]网站介绍 

    编程入门教程主要涉及WEB开发领域,主要为广大WEB开发人员提供最新的WEB开发资讯信息,包含php教程mysql教程php面试题在线调色板php学习以及常用( Amazon ApiGoogle Api)等API、爱问资源共享HTML转JS不显示xml...[详细]
广告投放: 编程入门教程:www.ask186.com 电话:15818865556

        PHP3版本中是如何实现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: \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"));    (  PHP3版本中是如何实现session php 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    (  PHP3版本中是如何实现session php session讲解应用 
        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)    (  PHP3版本中是如何实现session php session讲解应用 
        -> );
      下一步,修改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文件。你可以用隐含表单的域来保存它。这样就不会有问题。

站长推荐:PHP模仿面向对象的机制来读取一个目录

  • 上一篇:
  • 下一篇:

本文地址:http://www.ask186.com/content/article/php/session/11198.html(转载请保留)

相关关键词搜索:PHP3版本中是如何实现session php session讲解应用

查看评论更多>>
4楼 liujian 2015-04-21 17:34发表
好网站,值得收藏,以后会多多来看,很多文章内容都挺好的!
3楼 niulang 2015-04-21 17:33发表
不论国外,单是我们中国,各种各样的网站数不胜数。打开页面第一个看到的不是你的网站有什么,而是你的整体布局,一个清爽、干净、整洁的页面是一个赢得人心的法宝,大站有大站的气势,小站有小站的风格,好的视觉效果可以告诉人们这个站点有实力,这个站点值得信赖,给人很强的亲和力,有一种发现新宝地,希望赶紧收藏的冲动。
2楼 leenons 2015-04-21 17:28发表
现在看php学习网都会在百度上面找找看评分怎么样,值不值得一看;同时也会将看过的php教程网站记录,有时候留下一些自己的感想的评论,有很多逗比的评论,还有很多专业的评论,建议大家可以在web开发网上面寻找相关文章、api,大部分的内容都还合理。
1楼 xiaobudian 2015-04-21 17:25发表
网站文章挺不错的,值得学习,希望站长多多努力!
发表评论
      
* 以上用户言论只代表其个人观点,不代表www.ask186.com网站的观点或立场
推荐文档更多
编程入门教程 | PHP教程 | Mysql教程 | Apache教程 | 最新文章 | PHP面试题| 网站地图 | Google地图 | Baidu地图 | 在线WEB论坛| 中纪委反腐最新消息

WEB技术QQ交流群:151963186 站长Q号:547214413
版权所有者:编程入门教程 地址:云南省文山州砚山县盘龙乡 滇ICP备12002707号-1
特别声明:本站内容仅供参考,不作为设计及确切依据!想了解更多,可立即进入Bbs提问