不帅 发表于 2015-2-3 23:59:21

PHP编程:跟我来学PHP5:session会话的利用和剖析...

左手拿着MOTOLOLA右手拿着NOKIA,要多潇洒,有多潇洒,哈哈,终于学会了,但是可能这个时候,又会有人不经意的拍拍肩膀对你说:哥们,别高兴的太早,你还是菜鸟,离学会还差着一大截呢!     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 变量或有轮回援用的对象(即某对象将一个指向本人的援用传递给另外一个对象)。
<P>  注册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)逐一删除。****/
$_SESSION = array();
/***删除sessin id.因为session默许是基于cookie的,所以利用setcookie删除包括session id的cookie.***/
if (isset($_COOKIE)) {
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 相干的进击。
<P>  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开发学习,或许只是一次偶然的想法吧!只是想在走向社会之前体验、学习在一个公司或者说是项目团队之中如何去更有效的沟通、交流、共同合作,还有就是为毕业实习找工作增加伐码。

谁可相欹 发表于 2015-2-5 15:10:21

至于模板嘛,各位高人一直以来就是争论不休,我一只小菜鸟就不加入战团啦,咱们新手还是多学点东西的好。

第二个灵魂 发表于 2015-2-12 10:07:55

刚开始安装php的时候,我图了个省事,把php的扩展全都打开啦(就是把php.ini 那一片 extension 前面的冒号全去掉啦),这样自然有好处,以后不用再需要什么功能再来打开。

灵魂腐蚀 发表于 2015-2-28 15:05:32

在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。

爱飞 发表于 2015-3-6 03:54:11

兴趣是最好的老师,百度是最好的词典。

分手快乐 发表于 2015-3-12 19:34:23

基础有没有对学习php没有太大区别,关键是兴趣。

活着的死人 发表于 2015-3-20 01:54:16

至于模板嘛,各位高人一直以来就是争论不休,我一只小菜鸟就不加入战团啦,咱们新手还是多学点东西的好。

蒙在股里 发表于 2015-3-29 20:23:19

首先我是坚决反对新手上来就用框架的,因为对底层的东西一点都不了解,造成知识上的真空,会对以后的发展不利。我的观点上手了解下框架就好,代码还是手写。当然啦如果是位别的编程语言的高手的话,这个就另当别论啦。

乐观 发表于 2015-3-29 20:42:49

有时候汉字的空格也能导致页面出错,所以在写代码的时候,要输入空格最好用引文模式。

透明 发表于 2015-4-3 18:09:23

php是动态网站开发的优秀语言,在学习的时候万万不能冒进。在系统的学习前,我认为不应该只是追求实现某种效果,因为即使你复制他人的代码调试成功,实现了你所期望的效果,你也不了解其中的原理。

不帅 发表于 2015-4-6 17:53:19

最后介绍一个代码出错,但是老找不到错误方法,就是 go to wc (囧),出去换换气没准回来就找到错误啦。

若相依 发表于 2015-4-9 17:31:05

至于模板嘛,各位高人一直以来就是争论不休,我一只小菜鸟就不加入战团啦,咱们新手还是多学点东西的好。

再现理想 发表于 2015-4-10 05:10:57

真正的方向了,如果将来要去开发团队,你一定要学好smarty ,phplib这样的模板引擎,

深爱那片海 发表于 2015-4-12 23:17:26

php是动态网站开发的优秀语言,在学习的时候万万不能冒进。在系统的学习前,我认为不应该只是追求实现某种效果,因为即使你复制他人的代码调试成功,实现了你所期望的效果,你也不了解其中的原理。

因胸联盟 发表于 2015-4-14 15:38:19

装在C盘下面可以利用windows的ghost功能可以还原回来(顺便当做是重转啦),当然啦我的编译目录要放在别的盘下,不然自己的劳动成果就悲剧啦。

只想知道 发表于 2015-4-21 14:20:02

首推的搜索引擎当然是Google大神,其次我比较喜欢 百度知道。不过搜出来的结果往往都是 大家copy来copy去的,运气的的概率很大。

愤怒的大鸟 发表于 2015-4-24 04:58:41

其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。

admin 发表于 2015-5-6 08:09:13

你很难利用原理去编写自己的代码。对于php来说,系统的学习我认为还是很重要的,当你有一定理解后,你可你针对某种效果研究,我想那时你不会只是复制代码的水平了。

飘灵儿 发表于 2015-6-5 14:37:01

我还是强烈建议自己搭建php环境。因为在搭建的过程中你会遇到一些问题,通过搜索或是看php手册解决问题后,你会更加深刻的理解它们的工作原理,了解到php配置文件中的一些选项设置。
页: [1]
查看完整版本: PHP编程:跟我来学PHP5:session会话的利用和剖析...