文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>session用法详解

session用法详解

时间:2006-03-08  来源:cnscn2008


                [From]http://www.cublog.cn/u/8573/showart.php?id=77009
在客户端与服务器的交互过程中,我们通过session记录用户的有关信息,以供用户再次以此身份对web服务器提供要求时作确认。session用中文来解释就是会话期。一个会话期开始于用户输入一个站点的网址时,结束于他离开这个站点时。
session中注册的变量可以作为全局变量使用.
php
中的session也是通过取得cookie实现的。cookie 存在于客户端,也就是用户的机器中,里面保存着用户的session
ID,也就是session号码,当用户的浏览器请求服务器时把session
ID也一起送到服务器,这样服务器就可以把变量识别开了。这样我们就不难理解了,为什么有时session会失效了。不信的话,你可以试试:
在IE的"工具"菜单上有"Internet选项"菜单,打开后再选"安全"->"自定义级别",将安全设置中的"允许使用每个对话
cookies"设为禁用,再看看session能不能用。不过php4在linux/unix平台上可以自动检查cookies状态,当cookies
不可用时,自动会把session ID附带在url上进行传递。
从php4开始php对session有了的全面支持。php4时代的session实现大都从phplib学来的,它也靠cookies保存
session id,用文件系统保存变量(默认情况下)。因此,它的session
变量不能保存对象(事实上能保存对象内容,但没有意义,因为它是保存在磁盘上的,不是活的对象,充其量也就是对象尸体。)不过这点的限制不是太大,我们在
大部分情况下都只需要保存变量就行了。当然你也可以将session保存在数据库中。
在php4以后的版本由于比php3多了session支持,所以在php.ini文件中也多了session配置选项。下面我们来看看各项的作用与意义:
[Session]
session.save_handler = files ; handler used to store/retrieve data(用什么保存session变量,默认情况下用文件)
session.save_path = c:/temp ; argument passed to save_handler(保存session变量的目录,在linux/unix下为/tmp,在win下设为你的目录)
; in the case of files, this is the
; path where data files are stored
session.use_cookies = 1 ; whether to use cookies(是否使用cookies,当然,在win下别无选择)
session.name = PHPSESSID
; name of the session(默认session使用的cookies名,建议不要改动)
; is used as cookie name
session.auto_start = 0 ; initialize session on request startup(是否自动启用session,当为1时,在每页中就可以不必调用session_start()函数了)
session.cookie_lifetime = 0 ; lifetime in seconds of cookie(设定 cookie 送到浏览器后的保存时间,单位为秒。缺省值为 0,表示直到浏览器关闭。)
; or if 0, until browser is restarted
session.cookie_path = / ; the path the cookie is valid for(cookie)(cookies有效路径)
session.cookie_domain = ; the domain the cookie is valid for(cookies有效域名)
session.serialize_handler = php ; handler used to serialize data(定义序列化数据的标识,本功能只有 WDDX 模块或 PHP 内部使用。缺省值为 php)
; php is the standard serializer of PHP
session.gc_probability = 1 ; percentual probability that the (设定每次临时文件开始处理 (gc, garbage collection) 处理概率。缺省值为 1。 )
; garbage collection process is started
; on every session initialization
session.gc_maxlifetime = 1440 ; after this number of seconds, stored(设定保存session的临时文件被清除前的存活秒数)
; data will be seen as garbage and
; cleaned up by the gc process
session.referer_check = ; check HTTP Referer to invalidate (决定参照到客户端的 Session 代码是否要删除。有时在安全或其它考虑时,会设定不删除。缺省值为 0。)
; externally stored URLs containing ids
session.entropy_length = 0 ; how many bytes to read from the file(设定 session 从高熵值资源读取的位数。缺省值为 0.)
session.entropy_file = ; specified here to create the session id(设定 session 代码建立时,使用外部高熵值资源或文件来建立,例如 UNIX 系统上的 /dev/random 或
/dev/urandom。 )
; session.entropy_length = 16
; session.entropy_file = /dev/urandom
session.cache_limiter = nocache ; set to {nocache,private,public} to (设定session 缓冲限制)
; determine HTTP caching aspects
session.cache_expire = 180 ; document expires after n minutes(文档有效期,单位为分钟)

完成一个session注册并删除需要的函数主要有以下几个
session_start: 初始化session,根据当前会话的session_id创建session。需要用session的每一个页面最开始处调用。
$_SESSION 包含当前脚本中 session 变量的数组,所以可以用向数组中添加元素的方法注册新的session变量。它是一个全局变量,可以在网站的anywhere使用。
如$_SESSION["name"] = camel;
当然也可以用session_register函数来注册session
如 $name = camel;
   session_register("name");  达到效果都是一样地。
如果想确认某个变量是否被注册,则要用到session_is_registered。此函数返回true或false。可以防止用户重复注册session.
session用完后需要注销,注销session有好几个函数可以用。
session_unregister();
session_unregister()函数主要作用是注消当前的一个session变量。它需要明确指明要注销哪个session变量的。如session_unregister("name");
session_destroy
()是清除当前的session环境。意思就是说,当你用session_destroy()函数后,那么你就不可能再用
session_is_registered()来检测session的变量了。但是需要注意的是他不能清除global中的session或使用了
session
cookie的中的session.也就是说,它只能清除session_register()进来的变量,而不能清除$_SESSION或$
HTTP_SESSION_VARS进来的变量。
而$_SESSION注册进来的变量,清除起来也比较容易,它本身就是一个数组,任何清空数组的办法对它都有用,$_SESSION=array();就over了
如果不幸在程序中同时使用了$_SESSION和session_register来注册变量,省事一点的办法,session_unset();就万事大吉了。
再来回想一下我们使用session的流程:
创建session->
session star()
把变量注入session()->
$_SESSION,session_register()
删除变量->
session_unregister(),session_distroy(),$_SESSION,unset().
==================================================================
[From]http://www.cublog.cn/u/8573/showart.php?id=75205
PHP的session功能,一直为许多的初学者为难。就连有些老手,有时都被搞得莫名其妙。本文,将这些问题,做一个简单的汇总,以便大家查阅。
     
   1.
   错误提示
   Warning: Cannot send session cookie - headers already sent
   Warning: Cannot send session cache limiter - headers already sent
   分析及解决办法
  
这一类问题,的原因是你在程序中使用session_start()时,之前已经有实际的html内容输出了。或许你说,我没有啊,我只不过是echo或
print一条消息了。很抱歉,你的echo或print语句所产生的输出,就是实际的html内容输出。解决此类问题的办法是,将你的
session_start()调到程序的第一行。
     
   2.
   错误提示
   Warning: open(F:/689\php\sessiondata\sess_66a39376b873f4daecf239891edc98b5, O_RDWR) failed
   分析及解决方法
   出现这样的错误语句一般是因为你的php.ini中关于session.save_path一项没有设置好,解决的方法是将session.save_path和session.cookie_path 设置置为
   session_save_path = c:\temp
   session.cookie_path = c:\temp
   然后在c:\目录下建立一个temp目录,即可
     
   3.
   错误提示
   Warning: Trying to destroy uninitialized session in
   分析及解决方法
  
出类这样的提示,一般情况都是你直接调session_destroy()函数造成的。很多的朋友认为session_destroy()函数可以独立的
运行,其实不然。解决的方法是在你调session_destroy()函数之前,要用session_start()开启session的功能。
     
   4.问题:怎么获得当前session的id值呢?
   最简单的方法是:
   echo SID;
   你会发现的。
     
  
5.问题:我的程序,在调用header函数之前没有任何的输出,虽然我include了一个config.php文件,但在config.php文件中
也没有任何的输出,为什么session还是会报出与问题1同样的错误呢,是不是因为我在header之前用了session_start()的缘故呢?
  
答:或许你确实认真的检查了你的php程序,在引用header()之前确实也没有任何的输出,并且在你的include文件中也没有任何的输出!但是你
是否用光标键在?>这个PHP代码结束语句后移动检查呢?那么你会发现在?>这个后面,有一个空行或几个空格,你删除了这几个空行或空格,那
么问题就解决了。
   注:此问题,会出PHP4.1.2中,更高版本,没有测试过。
     
   6.问:用session做登录主页面后,其它页面怎么用session限制登录。。。
   答:最简单的方法是
   session_start();
   if(!session_registered(\'login\') ││ $login != true) {
   echo \"你没有登陆\";
   exit;
   }
     
   7.问:我用session_register()注册了session变量,可是当我用header或用javascript的重定向语句,那么在一下页面中,我却访问不到session所注册的变量值。请问如何解决?
   问题的程序片段:
       session_start();
   $ok = \'love you\';
   session_register(\'ok\');
   header(\"location : next.php\");
   ?>
     
   next.php
       session_start();
   echo $ok;
   ?>
     
   解决的方法:
   当你用header函数或window.location这样的功能后,你上一个页面所注册的session变量,就会容易的丢失,关于这个问题的原因,至今仍没有一个详细的回答。
   不过有解决的方法。如下所示
   header(\"Location: next.php\" .\"?\" . SID);
   在跳转到下一页面的时候,将session的当前id做为一个参数,传到后一个页面。
     
   8.session如何传数组
   session_register(\'data\');
   $data=array(1,2,3,4);
     
   方法是先注册后赋值
     
   9.问题9:我是不是可以用像$HTTP_GET_VARS[\'**\']方式来访问session值呢?
     
   回答:可以,你可以使用如下global数组来访问session,以加强网页的安全性
   $HTTP_SESSION_VARS
   $_SESSION
   例程:
       session_start();
   $username = \'stangly.wrong\';
   session_register(\'username\');
     
   echo $HTTP_SESSION_VARS[\'username\'];
   echo \'
   \';
   echo $_SESSION[\'username\'];
   ?>
   请参照此例程修改符合您自己的程序。
     
   问题10:session_unregister() 和 session_destroy() 有何区别?
  
session_unregister()函数主要作用是注消当前的一个session变量。不过要注意的是,如果你用$
HTTP_SESSION_VARS或$_SESSION在当前页面中引用过session变量,那么你可能需要和unset()配合
来注消session变量。
  
而session_destroy()是清除当前的session环境。意思就是说,当你用session_destroy()函数后,那么你就不可能再
用session_is_registered()来检测session的变量了。但是需要注意的是他不能清除global中的session或使用了
session cookie的中的session.所以在用session_destroy之前,最好不要用$HTTP_SESSION_VARS
$_SESSION来访问session.(译自于php.net)
     
   例程:
   if(isset($_COOKIE[session_name()])) {
   session_start();
   session_destroy();
   unset($_COOKIE[session_name()]);
   }
     
     
   以上,所述是一些新手经常遇到的问题。或许是详述不清,难免有误所在,请高手指点批评。
               
               
               
               
               

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载