`
v5qqcom
  • 浏览: 1282130 次
文章分类
社区版块
存档分类
最新评论

php session新手入门教程

 
阅读更多

Session简介
session 分成两部分,session空间存放于服务器端,打开空间的ID 存放于 客户端的cookie, 如果客户端关闭了cookie,session就不能正常的使用。

Session的中文译名叫做“会话”,其本来的含义是指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session。目前社会上对session的理解非常混乱:有时候我们可以看到这样的话“在一个浏览器会话期间,...”,这里的会话是指从一个浏览器窗口打开到关闭这个期间; 也可以看到“用户(客户端)在一次会话期间”这样一句话,它可能指用户的一系列动作(一般情况下是同某个具体目的相关的一系列动作,比如从登录到选购商品到结账登出这样一个网上购物的过程;然而有时候也可能仅仅是指一次连接;其中的差别只能靠上下文来推断了。  

 然而当session一词与网络协议相关联时,它又往往隐含了“面向连接”和/或“保持状态”这样两个含义,“面向连接”指的是在通信双方在通信之前要先建立一个通信的渠道,比如打电话,直到对方接了电话通信才能开始。“保持状态”则是指通信的一方能够把一系列的消息关联起来,使得消息之间可以互相依赖,比如一个服务员能够认出再次光临的老顾客并且记得上次这个顾客还欠店里一块钱。这一类的例子有“一个TCP session”或者“一个POP3 session”。  

 鉴于这种混乱已不可改变,要为session下个定义就很难有统一的标准。而在阅读session相关资料时,我们也只有靠上下文来推断理解了。不过我们可以这样理解:例如我们打电话,从拨通的那一刻起到挂断电话期间,因为电话一直保持着接通的状态,所以把这种接通的状态叫做session。它是访客与整个网站交互过程中一直存在的公有变量,在客户端不支持COOKIE的时候,为了保证数据正确、安全,就采用SESSION变量。访问网站的来客会被分配一个唯一的标识符,即所谓的会话 ID。它要么存放在客户端的 cookie,要么经由 URL 传递。  

 SESSION的发明填补了HTTP协议的局限:HTTP协议被认为是无状态协议,无法得知用户的浏览状态,当它在服务端完成响应之后,服务器就失去了与该浏览器的联系。这与HTTP协议本来的目的是相符的,客户端只需要简单的向服务器请求下载某些文件,无论是客户端还是服务器都没有必要纪录彼此过去的行为,每一次请求之间都是独立的,好比一个顾客和一个自动售货机或者一个普通的(非会员制)大卖场之间的关系一样。  

 因此通过SESSION(cookie是另外一种解决办法)记录用户的有关信息,以供用户再次以此身份对web服务器提起请求时作确认。会话的发明使得一个用户在多个页面间切换时能够保存他的信息。网站编程人员都有这样的体会,每一页中的变量是不能在下一页中使用的(虽然form,url也可以实现,但这都是非常不理想的办法),而SESSION中注册的变量就可以作为全局变量使用了。  

 那么SESSION到底有什么用处呢?网上购物时大家都用过购物车,你可以随时把你选购的商品加入到购物车中,最后再去收银台结帐。在整个过程中购物车一直扮演着临时存贮被选商品的角色,用它追踪用户在网站上的活动情况,这就是SESSION的作用,它可以用于用户身份认证,程序状态记录,页面之间参数传递等。  

 SESSION的实现中采用COOKIE技术,SESSION会在客户端保存一个包含session_id(SESSION编号)的COOKIE;在服务器端保存其他session变量,比如session_name等等。当用户请求服务器时也把session_id一起发送到服务器,通过session_id提取所保存在服务器端的变量,就能识别用户是谁了。同时也不难理解为什么SESSION有时会失效了。  

 当客户端禁用COOKIE时(点击IE中的“工具”—“Internet选项”,在弹出的对话框里点击“安全”—“自定义级别”项,将“允许每个对话COOKIE”设为禁用),session_id将无法传递,此时SESSION失效。不过php5在linux/unix平台可以自动检查cookie状态,如果客户端设置了禁用,则系统自动把session_id附加到url上传递。windows主机则无此功能。

 Session常见函数及用法?  

 Session_start() :开始一个会话或者返回已经存在的会话。  

 说明:这个函数没有参数,且返回值均为true。如果你使用基于cookie的session(cookie-based sessions),那么在使用Session_start()之前浏览器不能有任何输出,否则会发生以下错误: Warning: Cannot send session cache limiter - headers already sent (output started at /usr/local/apache/htdocs/cga/member/1.php:2)…………   

你可以在php.ini里启动session.auto_start=1,这样就无需每次使用session之前都要调用session_start()。但启用该选项也有一些限制,如果确实启用了 session.auto_start,则不能将对象放入会话中,因为类定义必须在启动会话之前加载以在会话中重建对象。  

 请求结束后所有注册的变量都会被序列化。已注册但未定义的变量被标记为未定义。在之后的访问中这些变量也未被会话模块定义,除非用户以后定义它们。

  警告: 有些类型的数据不能被序列化因此也就不能保存在会话中。包括 resource 变量或者有循环引用的对象(即某对象将一个指向自己的引用传递给另一个对象)。

注册SESSION变量   

PHP5使用$_SESSION[‘xxx’]=xxx注册SESSION全局变量。

和GET,POST,COOKIE的使用方法相似。  

 注意:session_register(),session_unregister ,session_is_registered在php5下不再使用,除非在php.ini里把register_globle设为on,不过出于安全考虑,强烈建议关闭register_globle。HTTP_SESSION_VARS也不提倡使用了,官方建议用$_SESSION代替之。

例如:  

 Page1.php <?php Session_start(); //使用SESSION前必须调用该函数。

$_SESSION[‘name’]=”我是黑旋风李逵!”;

//注册一个SESSION变量 $_SESSION[‘passwd’]=”mynameislikui”;

$_SESSION[‘time’]=time();

echo '<br /><a href="page2.php">通过COOKIE传递SESSION</a>';

//如果客户端支持cookie,可通过该链接传递session到下一页。

echo '<br /><a href="page2.php?' . SID . '">通过URL传递SESSION</a>';

//客户端不支持cookie时,使用该办法传递session. ?>  

 Page2.php <?php session_start(); echo $_SESSION['name'];

// echo $_SESSION['passwd'];

// echo date('Y m d H:i:s', $_SESSION['time']);

echo '<br /><a href="page1.php">返回山一页</a>'; ?>  

 有两种方法传递一个会话 ID:   cookie   URL 参数  

 会话模块支持这两种方法。cookie 更优化,但由于不总是可用,也提供替代的方法。第二种方法直接将会话 ID 嵌入到 URL 中间去。 PHP 可以透明地转换连接。除非是使用 PHP 4.2 或更新版本,需要手工在编译 PHP 时激活。在 Unix 下,用 --enable-trans-sid 配置选项。如果此配置选项和运行时选项 session.use_trans_sid 都被激活(修改php.ini),相对 URI 将被自动修改为包含会话 ID。

session_id   
session_id() 用于设定或取得当前session_id。

php5中既可以使用session_id(),也可以通过附加在url上的SID取得当前会话的session_id和session_name。   

如果session_id()有具体指定值的话,将取代当前的session_id值。使用该函数前必须启动会话:session_start(); 当我们使用session cookies时,如果指定了一个session_id()值,每次启动session_start()都会往客户端发送一个cookie值。不论当前session_id是否与指定值相等。

  session_id()如果没有指定值,则返回当前session_id();当前会话没有启动的话,则返回空字符串。  

检查session是否存在?   

在以往的php版本中通常使用session_is_register()检查session是否存在,如果您使用$_SESSION[‘XXX’]=XXX来注册会话变量,则session_is_register()函数不再起作用。你可以使用isset($_SESSION[‘xxx’])来替代。   

● 更改session_id session_regenerate_id() 更改成功则返回true,失败则返回false。  

 使用该函数可以为当前session更改session_id,但不改变当前session的其他信息。

例如:

<?php

session_start();

$old_sessionid = session_id();

session_regenerate_id();

$new_sessionid = session_id();

echo "原始 SessionID: $old_sessionid<br />";

echo "新的 SessionID: $new_sessionid<br />";

echo"<pre>"; print_r($_SESSION);

echo"</pre>";

?>   

● session_name() 返回当前session的name或改变当前session的name。

如果要改变当前session的name,必须在session_start()之前调用该函数。

注意:session_name不能只由数字组成,它至少包含一个字母。否则会在每时每刻都生成一个新的session id.   

session改名示例:

<?php

$previous_name = session_name("WebsiteID");

echo "新的session名为: $previous_name<br />";

?>   

如何删除session?  

 1、unset ($_SESSION['xxx']) 删除单个session,unset($_SESSION['xxx']) 用来unregister一个已注册的session变量。其作用和session_unregister()相同。session_unregister()在PHP5中不再使用,可将之打入冷宫。  

 unset($_SESSION) 此函数千万不可使用,它会将全局变量$_SESSION销毁,而且还没有可行的办法将其恢复。用户也不再可以注册$_SESSION变量。

  2、$_SESSION=array() 删除多个session  

 3、session_destroy()结束当前的会话,并清空会话中的所有资源。。该函数不会unset(释放)和当前session相关的全局变量(globalvariables),也不会删除客户端的session cookie.PHP默认的session是基于cookie的,如果要删除cookie的话,必须借助setcookie()函数。

  返回值:布尔值。   

功能说明:这个函数结束当前的session,此函数没有参数,且返回值均为true   

session_unset() 如果使用了$_SESSION,则该函数不再起作用。由于PHP5必定要使用$_SESSION,所以此函数可以打入冷宫了。   

下面是PHP官方关于删除session的案例:

<?php // 初始化session. session_start();

/*** 删除所有的session变量..也可用unset($_SESSION[xxx])逐个删除。****/

$_SESSION = array();

/***删除sessin id.由于session默认是基于cookie的,所以使用setcookie删除包含session id的cookie.***/

if (isset($_COOKIE[session_name()])) { setcookie(session_name(), '', time()-42000, '/'); }

// 最后彻底销毁session. session_destroy();

?>   

由此我们可以得出删除Session的步骤:   

①session_start()   

②$_SESSION=array()/unset($_SESSION['xxx'])   

③session_destroy()   

SESSION安全:   

会话模块不能保证存放在会话中的信息只能被创建该会话的用户看到。根据其存放的数据,还需要采取更多措施来主动保护会话的完整性。   

评估会话中携带的数据并实施附加保护措施通常要付出代价,降低用户的方便程度。例如,如果要保护用户免于受简单的社交策略侵害(注:指在 URL 中显示的会话 ID 会被别人在电脑屏幕上看到,或被别的网站通过 HTTP Referer 得到等),则应该启用 session.use_only_cookies。此情形下,客户端必须无条件启用 cookie,否则会话就不工作。  

 有几种途径会将现有的会话 ID 泄露给第三方。泄露出的会话 ID 使第三方能够访问所有与指定 ID 相关联的资源。第一,URL 携带会话 ID。如果连接到外部站点,包含有会话 ID 的 URL 可能会被存在外部站点的 Referer 日志中。第二,较主动的攻击者可能会侦听网段的数据包。如果未加密,会话 ID 会以明文方式在网络中流过。对此的解决方式是在服务器上实施 SSL 并强制用户使用。

  默认情况下,所有与特定会话相关的数据都被存储在由 INI 选项 session.save_path 指定的目录下的一个文件中。对每个会话会建立一个文件(不论是否有数据与该会话相关)。这是由于每打开一个会话即建立一个文件,不论是否有数据写入到该文件中。注意由于和文件系统协同工作的限制,此行为有个副作用,有可能造成用户定制的会话处理器(例如用数据库)丢失了未存储数据的会话。上面介绍函数下文将会用到,但还有一些有关session的函数也介绍一下:

  session_encode  

 函数功能:sesssion信息编码  

 函数原型:string session_encode(void);   

返回值:字符串   

功能说明:返回的字符串中包含全局变量中各变量的名称与值,形式如:a|s:12:"it is a test/";c|s:4:"lala"; a是变量名 s:12代表变量a的值"it is a test的长度是12 变量间用分号”;”分隔。

  session_decode   

函数功能:sesssion信息解码  

 函数原型:boolean session_decode (string data)   

返回值:布尔值   

功能说明:这个函数可将session信息解码,成功则返回逻辑值true   

Php5不再使用session_id,而是把它变成一个常量SID,并保存在cookie中。如果客户端禁用了cookie,php会自动通过url自动传动传递SID,其条件是设置php.ini中的session.use_trans_sid = 1。此时即使客户端即使禁用了cookie也没关系了。   

用 strip_tags() 来输出 SID 以避免 XSS 相关的攻击。

Session跨页传递问题:  

 session跨页传递需要考虑三种情况:  

 ①客户端禁用了cookie。   

②浏览器出现问题,暂时无法存取cookie   

③php.ini中的session.use_trans_sid = 0或者编译时没有打开--enable-trans-sid选项   为什么会这样呢?

下面解释一下原因:  

 Session文件分为两部分:session变量保存在服务器端(默认以文件方式存储session);而session id则以cookie形式保存在客户端。(注意:session默认是基于cookie的)。   

当用户的浏览器向服务器提出请求时,同时发送包含session id的cookie(默认情况下)。服务器根据客户端提供的session id来得到用户的文件,即保存在服务器端的session变量值。事实上,session id可以使用客户端的Cookie或者Http1.1协议的Query_String(就是访问的URL的“?”后面的部分)来传送给服务器,然后服务器读取Session的目录……。

也就是说,session id是取得存储在服务上的session变量的身份证。当代码session_start();运行的时候,就在服务器上产生了一个session文件,随之也产生了与之唯一对应的一个session id,定义session变量以一定形式存储在刚才产生的session文件中。通过session id,可以取出定义的变量。跨页后,为了使用session,你必须又执行session_start();将又会产生一个session文件,与之对应产生相应的session id,用这个session id是取不出前面提到的第一个session文件中的变量的,因为这个session id不是打开它的“钥匙”。如果在session_start();之前加代码session_id($session id);将不产生新的session文件,直接读取与这个id对应的session文件。   

PHP中的session在默认情况下是使用客户端的Cookie来保存session id的,所以当客户端的cookie出现问题的时候就会影响session了。

必须注意的是:session不一定必须依赖cookie,这也是session相比cookie的高明之处。当客户端的Cookie被禁用或出现问题时,PHP会自动把session id附着在URL中,这样再通过session id就能跨页使用session变量了。但这种附着也是有一定条件的,

其一:“php.ini中的session.use_trans_sid = 1或者编译时打开打开了--enable-trans-sid选项”;其二:运行PHP的服务器必须是unix/linux系统,windows不具备此项功能。   明白了以上的道理,我们就可以得出解决session跨页传递问题的三条途径:   

1、设置php.ini中的session.use_trans_sid = 1或者编译时打开打开了--enable-trans-sid选项,让PHP自动跨页传递session id。   

2、手动通过URL传值、隐藏表单传递session id。   

3、用文件、数据库等形式保存session_id,在跨页过程中手动调用。   

下面举例说明:   

第一种情况:   

page1.php

<?php

session_start();

$_SESSION['var1']="中华人民共和国";

$url="<a href="."/"s2.php/">下一页</a>"; echo $url;

?>   

page2.php

<?php

session_start();

echo "传递的session变量var1的值为:".$_SESSION['var1'];

?>   

运行以上代码,在客户端cookie正常的情况下,应该可以在得到结果“中华人民共和国”。   

现在你手动关闭客户端的cookie,再运行,可能得不到结果了吧。如果得不到结果,再“设置php.ini中的session.use_trans_sid = 1或者编译时打开打开了--enable-trans-sid选项”,又得到结果“中华人民共和国”   

第二种途径:   

s1.php

<?php

session_start();

$_SESSION['var1']="中华人民共和国";

$sn = session_id();

$url="<a href="."/"s2.php?s=".$sn."/">下一页</a>";

//PHP5定义了一个常量SID来表示session_id(),$url还可以写成$url='<a href="page2.php?' . SID . '">下一页</a>'; echo $url;

?>  

 s2.php

<?php

session_id($_GET['s']);

session_start();

echo "传递的session变量var1的值为:".$_SESSION['var1'];

?>   

第三种途径:

login.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<head>

<title>Login</title>

<meta http-equiv="Content-Type" content="text/html; charset=??????">

</head>

<body>   请登录:

<form name="login" method="post" action="mylogin1.php">

用户名:<input type="text" name="name">

<br>

口 令:

<input type="password" name="pass">

<br>

<input type="submit" value="登录">

</form>

</body>

</html>

  mylogin1.php

<?php

$name=$_POST['name'];

$pass=$_POST['pass'];

if(!$name || !$pass)

{  echo "用户名或密码为空,请<a href=/"login.html/">重新登录</a>";  

die();

}

if(!($name=="laogong" && $pass=="123"))

{  echo "用户名或密码不正确,请<a href=/"login.html/">重新登录</a>";  die(); }

//注册用户

ob_start();

session_start();

$_SESSION['user']= $name;

$psid=session_id(); $fp=fopen("e://tmp//phpsid.txt","w+");

fwrite($fp,$psid);

fclose($fp); //身份验证成功,进行相关操作

echo "已登录<br>";

echo "<a href=/"mylogin2.php/">下一页</a>";

?>   


mylogin2.php

<?php

$fp=fopen("e://tmp//phpsid.txt","r");

$sid=fread($fp,1024); fclose($fp);

session_id($sid);

session_start();

if(isset($_SESSION['user']) && $_SESSION['user']="laogong" )

{  

echo "已登录!"; } else {  //成功登录进行相关操作 echo "未登录,无权访问";

echo "请<a href=/"login.html/">登录</a>后浏览";  

die();

}

?>
分享到:
评论

相关推荐

    PHP中session全面教程.txt

    PHP中session全面教程.txt PHP中session全面教程.txt

    PHP中session全面教程

    session是什么,刚开始我也不明白,非专业词典翻译为会议,会议期。直到接触asp后才知道session是干什么的,有什么用。 作个不太恰当的比喻吧(虽然不恰当,但意义却是一样的),session就好象你和你女友(或妻子)...

    PHP从入门到精通.pdf-入门教程.CHM

    《PHP从入门到精通》从初学者角度出发,通过通俗易懂的语言,丰富多彩的实例,详细介绍了使用PHP进行网络开发应该掌握的各方面...PHP入门教程 CHM 中文手册,使用很方便~ 让php初学者,找到学习的好方法,就1分,来吧。

    php session登录

    php session登录。附数据表执行SQL,HTML前端代码,PHP代码。

    PHP100视频教程 32:PHP5中Cookie与 Session详解

    1、Cookie和Session简介与区别Session信息是存放在server端,但session id是存放在client cookie的,当然php的session存放方法是多样化的,这样就算禁用cookie一样可以跟踪Cookie是完全保持在客户端的如:IE firefox...

    详解php设置session(过期、失效、有效期)

    在php中设置session有很多方面包有给session设置值或直接设置过期、失效和有效期,下面小编来给大家给各位朋友介绍怎么使用。 我们先来看看在php.ini中session怎么设置,打开 php.ini,查找Session设置部分中以下一...

    PHP的session基础

    关于PHP的session的基本使用 认识session的工作原理 1启动session 2读写session的变量 3删除session变量 4session在用户登录中的应用

    php新手入门

    php从零开始学习 新手入门 连接数据库 文件上传 验证码 session

    php5的session详解

    php5的session详解.pdf php5 的session详解其一:什么是session? php5 的session 详解之二:有两种方法传递 一个会话ID: php5 的session 详解之三:session安全 php5 的session 详解之四:……

    jsj_PHP中session全面教程.pdf

    jsj_PHP中session全面教程.pdf

    php-session类.zip

    一个完整的 Session 类,整合了 Session 最基本的属性值,其中,打开,关闭与清理是符合php编程规范的,这也是一个很好的习惯。小小的说明一下,如果网站不是大量使用 Session 类,基本上就没必要使用 SESSION 类了...

    php session阻塞页面分析及优化

    php session阻塞页面分析及优化

    php_session_decoder, 在Go中,编写了PHP会话编码器/解码器.zip

    php_session_decoder, 在Go中,编写了PHP会话编码器/解码器 php_session_decoderPHP会话编解码器/解码器 安装安装:安装推荐的方法是使用 gonuts.io:nut获取 yvasiyarov/php_session_decoder详细信息,请转到 http:/

    PHP 一个SESSION 购物车类

    用PHP写的购物车类,实现了 放入商品 修改数量 删除商品 显示购物车信息的功能.只用一个session就实现了 代码比较容易读懂,适合新手学习! 注意:有一个bug,最后一个del_cart()方法要先session_start(); 忘记加了!

    PHP实现多服务器session共享之memcache共享.rar

    PHP实现多服务器session共享之memcache共享

    PHP与Session

    PHP与Session实现购物车功能,PHP表单验证,js DOM操作

    php写的session购物车

    用php写的简单的session购物车,仅供初学者参考,高手莫喷

    基于memcahe的session方法重写(PHP)

    PHP session跨服务器跨域解决方案 基于memcahe的session方法重写

    php session操作类

    这是一个比较完整,且比较安全的session操作类,集成了,基本的操作方法

Global site tag (gtag.js) - Google Analytics