PHP开发中session应用详解

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"));
?>

 数组变量(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文件。你可以用隐含表单的域来保存它。这样就不会有问题。

时间: 2025-01-13 03:49:51

PHP开发中session应用详解的相关文章

ThinkPHP中session函数详解_php实例

在PHP中使用$_SESSION来操作session,而ThinkPHP提供了session的封装函数session().单单这一个函数就实现了session的增删改查的功能.下面我们分别来看其应用与实现. 该session()函数的定义是在Common/functions.php中定义. session配置 session($name='',$value='')函数有两个参数,$name为数组的时候是对session进行设置.使用如下: $name = array( 'name'=>'name

Android开发中LayoutInflater用法详解_Android

本文实例讲述了Android开发中LayoutInflater用法.分享给大家供大家参考,具体如下: 在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById().不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化:而findViewById()是找xml布局文件下的具体widget控件(如Button.TextView等). 具体作用: 1.对于一个没有被载入或者想要动态载入的界面,都需要使用Layout

ASP开发中存储过程应用详解

存储过程|详解 ASP与存储过程(Stored Procedures)的文章不少,但是我怀疑作者们是否真正实践过.我在初学时查阅过大量相关资料,发现其中提供的很多方法实际操作起来并不是那么回事.对于简单的应用,这些资料也许是有帮助的,但仅限于此,因为它们根本就是千篇一律,互相抄袭,稍微复杂点的应用,就全都语焉不详了. 现在,我基本上通过调用存储过程访问SQL Server,以下的文字都是实践的总结,希望对大家能有帮助. 存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令. 定义总是很

JSP页面中Session对象详解

Session:当用户打开浏览器,访问某个网站时,服务器就会在服务器的内存为该浏览器分配一个空间,改空间被这个浏览器独占.这个 Session:当用户打开浏览器,访问某个网站时,服务器就会在服务器的内存为该浏览器分配一个空间,改空间被这个浏览器独占.这个空间就是session空间,该控件中的数据默认存储时间为30min,可以修改.session.setMaxInactiveInterval(n秒); Session的用处: 1网上商城中的购物车 2 保存登录用户的信息 3 将某些数据放入到ses

asp.net中session会话状态详解

Session又称为会话状态,是Web系统中最常用的状态,用于维护和当前浏览器实例相关的一些信息.举个例子来说,我们可以把已登录用户的用户名放在Session中,这样就能通过判断Session中的某个Key来判断用户是否登录,如果登录的话用户名又是多少. 我们知 道,Session对于每一个客户端(或者说浏览器实例)是"人手一份",用户首次与Web服务器建立连接的时候,服务器会给用户分发一个 SessionID作为标识.SessionID是一个由24个字符组成的随机字符串.用户每次提交

Android开发中LayoutInflater用法详解

本文实例讲述了Android开发中LayoutInflater用法.分享给大家供大家参考,具体如下: 在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById().不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化:而findViewById()是找xml布局文件下的具体widget控件(如Button.TextView等). 具体作用: 1.对于一个没有被载入或者想要动态载入的界面,都需要使用Layout

ThinkPHP中session函数详解

在PHP中使用$_SESSION来操作session,而ThinkPHP提供了session的封装函数session().单单这一个函数就实现了session的增删改查的功能.下面我们分别来看其应用与实现. 该session()函数的定义是在Common/functions.php中定义. session配置 session($name='',$value='')函数有两个参数,$name为数组的时候是对session进行设置.使用如下: $name = array( 'name'=>'name

JSP开发中Cookie使用详解

用JSP创建cookie 什么是cookies 大家都知道,浏览器与WEB服务器之间是使用HTTP协议进行通信的,当某个用户发出页面请求时,WEB 服务器只是简单的进行响应,然后就关闭与该用户的连接.因此当一个请求发送到WEB服务器时,无论其 是否是第一次来访,服务器都会把它当作第一次来对待,这样的不好之处可想而知.为了弥补这个缺陷, Netscape开发出了cookie这个有效的工具来保存某个用户的识别信息,因此人们昵称为"小甜饼 ".cookies是一种WEB服务器通过浏览器在访问

javax.servlet.http.HttpSession session用法详解

javax.servlet.http.HttpSession session用法详解 HttpSession类它提供了setAttribute()和getAttribute()方法存储和检索对象. HttpSession提供了一个会话ID关键字,一个参与会话行为的客户端在同一会话的请求中存储 和返回它.servlet引擎查找适当的会话对象,并使之对当前请求可用.HttpServletRequest 接口提供了以下方法来获取HttpSession实例. public HttpSession get