求php session新手入门教程
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求php session新手入门教程相关的知识,希望对你有一定的参考价值。
我才学php不久的 到了session 那里我就看不懂了 有点繁琐 不是太懂
求最简单的入门教程 视频 文字 均可
来源:http://wsiyu.com/read.php?tid=526
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();
?> 参考技术A 1.在php中如何操作session:
session_start(); //使用该函数打开session功能
$_SESSION //使用预定义全局变量操作数据
使用unset($_SESSION['key']) //销毁一个session的值
简单地操作,一切都是由服务器实现;由于处理在后台,一切看起来也很安全。但是session采用什么样机制,又是怎样被实现,并且如何来保持会话的状态的呢?
2.session实现与工作原理
浏览器和服务器采用http无状态的通讯,为了保持客户端的状态,使用session来达到这个目的。然而服务端是怎么样标示不同的客户端或用户呢?
这里我们可以使用生活中的一个例子,假如你参加一个晚会,认识了很多人,你会采取什么方式来区分不同的人呢!你可能根据脸型,也有可能根据用户的名字,
或者人的身份证,即采用一个独一无二的标示。在session机制中,也采用了这样的一个唯一的session_id来标示不同的用户,不同的是:浏览器每次请求都会带上
由服务器为它生成的session_id.
简单介绍一下流程:当客户端访问服务器时,服务器根据需求设置session,将会话信息保存在服务器上,同时将标示session的session_id传递给客户端浏览器,
浏览器将这个session_id保存在内存中(还有其他的存储方式,例如写在url中),我们称之为无过期时间的cookie。浏览器关闭后,这个cookie就清掉了,它不会存在用户的cookie临时文件。
以后浏览器每次请求都会额外加上这个参数值,再服务器根据这个session_id,就能取得客户端的数据状态。
如果客户端浏览器意外关闭,服务器保存的session数据不是立即释放,此时数据还会存在,只要我们知道那个session_id,就可以继续通过请求获得此session的信息;但是这个时候后台的session还存在,但是session的保存有一个过期时间,一旦超过规定时间没有客户端请求时,他就会清除这个session。
下面介绍一下session的存储机制,默认的session是保存在files中,即以文件的方式保存session数据。在php中主要根据php.ini的配置session.save_handler
来选择保存session的方式。
这里顺便说明一下,如果要做服务器的lvs,即多台server的话,我们一般使用memcached的方式session,否则会导致一些请求找不到session。
一个简单的memcache配置:
session.save_handler = memcache
session.save_path = "tcp://10.28.41.84:10001"
当然如果一定要使用files文件缓存,我们可以将文件作nfs,将所有的保存session文件定位到一个地方。
刚才讲返回给用户的session-id最终保存在内存中,这里我们也可以设置参数将其保存在用户的url中。
3.实例问题
现有系统A,B; 假设A系统是可以独立运行的web系统,即可以和浏览器直接处理session, B系统是基于mobile的,需要调用A系统的功能接口,
在保持A不改变的情况下,即登陆验证,session存储都不变的情况下,B系统能处理前端用户的请求。
这里提供的方案是使用PHP实现
在用户登陆成功后,将保存的session的session-id返回给B系统,然后B系统每次请求其他接口都带session_id。A系统在session_start前加上session_id(session_id);
这样B系统就能安全的调用A
参考资料:PHP中session的工作原理 建站学
Session 入门 学习 详细教程
1,Session技术
1.1,Cookie的不足
Cookie是将会话数据,直接存储浏览器端。带来了:
问题一:安全性
问题二:数据传输。大量的会话每次都需要从浏览器端传输到服务器端。限制了浏览器端可以存储的会话数据量。
1.2,Session原理
将会话数据存储在服务器端。需要解决如何区分不同浏览器的会话数据问题。
方案如下:服务器端为不同的会话数据分配唯一的标志,浏览器去存储该标志。
1.3,基本操作
1.3.1,开启session功能
session_start()
操作session之前,一定要先开启session!
1.3.2,操作session数据
超全局$_SESSION数组,完成session数据的全部管理,增,删,修改,获取!
设置:
获取:
就像操作一个普通的数组一样,操作session即可!
1.4,Session标志,session-ID
一:session_id存储在浏览器端的cookie中,就是一个普通的cookie变量(他具有所有的cookie变量具有的属性)
二:服务器PHPsession功能,负责生成session-ID,并以cookie的形式,分配到浏览器前端。
查看浏览器已经存储的cookie中的session-ID:
如果浏览器没有携带session-ID:
响应数据中,就一定会重新分配
如果浏览器存在,则 请求时携带到服务器端,服务器端不需要再生成了:
1.5,服务器端session数据区
默认情况下,session数据区是位于服务器所在操作系统的临时目录中,以独立文件的形式进行存储的。
存储位置基于配置:
Php.ini
1.6,Session数据的属性
Session数据的属性,是依赖于session对于的session-Id这个cookie变量的属性的。
例如有效期:
由于session-ID这个cookie变量的有效期为会话周期,也导致session数据在浏览器关闭后立即失效!
其他的cookie变量具有的属性都是影响session-id的:
例如:
由上可见:session的默认属性为:
当前域名下,有效。
整站有效。
浏览器关闭失效。
设置session数据
我们也有办法设置session-id这个cookie变量的属性
setcookie(PHPSESSID);
方案一:推荐!
session_set_cookie_params(有效期,有效路径,有效主机,安全,httponly);
设置属,一定在 开启session机制之前!
强调,实操中,有效期,有效路径,等属性都是不需要修改的。
方案二:修改PHP的配置项
Session.cookie_lifetime有效期
Session.cookie_path有效路径
Session.cookie_domain有效域名
Session.cookie_secure,仅仅安全连接下传输(安全)
Session.cookie_httponly
选择修改配置文件,使得当前php服务器上所有的项目都统一session属性的默认值(不推荐)
配置项修改函数 ini_set(),在脚本周期内,修改某个配置项的值!(推荐)
1.7,$_SESSION 域 和session数据区(文件)关系
_SESSION变量的产生:在session_start时
如图所示:
1.8,销毁session,session_destory()
函数session_destory(),销毁session。
① 关闭session机制。(后期关于session的处理不再执行)《=》session_start
② 删除当前session对于的数据区文件。
导致,下个脚本周期。访问不到任何的session数据!
通常,退出,注销。当不需要整个会话的session数据时,可以选择销毁session!
该销毁session的函数,仅仅完成删除对于的session数据区(文件),但并不能同时删除$_SESSION数组,以及浏览器端的session-ID;
完全销毁session
通常逻辑上的销毁session,应该将于当前session相关的全部内容都删除,才合理:
应该同时删除,session-id,$_SESSION变量,session数据区都删除才可以:
其中:PHPSESSID,这个名字是可能被配置修改的!
Php 的配置:
通用的做法使用函数:session_name()来获取当前配置的session.name的值!
以上的语法细节:
Unset($_SESSION);删除session变量,不能独立使用。
如果想 清空所有的session数据时,不能使用,而应该:$_SESSION = array();
1.9,垃圾回收
存储于服务器端的session数据区,当满足垃圾条件时,被删除,回收可用的存储空间!
一:如何判定垃圾?
如果某个数据区(文件)超过有效期未被使用,则被视为垃圾数据区。
默认的有效期为:1440s,可以被配置的:
最后修改时间,有效期,当前时间 判断出来是否为垃圾:
垃圾:当前时间-最后修改时间 > 有效期。(最后修改时间 < 当前时间-有效期)
二:如何删除这些垃圾?
在开启session时(session_start())就会有一定的概率 触发 垃圾回收操作!
默认的概率是1/1000,可以被配置:
可能性:
基数(除数):
测试时,调整概率和有效期时间,来测试!
执行几次后,就会删除掉过期的数据区!
1.10,Session存储机制的重写
由其他方式存储session数据。默认是文件的方式。实操时:还有 数据库,内存管理器。
两个原因致使需要修改session的存储机制:
1:大量的session需要管理。
2:多web服务器共享session。
1.10.1,一:提供可存储操作的函数(方法)
共有6个,四个与存储直接相关,两个辅助。
以上函数,仅仅需要负责定义,而不需要负责调用。
PHP核心程序,在需要的时候完成调用!
1.10.1.1,创建session数据表
每个表中的记录,相当于原来的一个session文件。
结构如下:提醒 字段注释 -- 前后有空格 或者 用/* */
增加索引:Alter table session add index (last_write)
1.10.1.2,读操作
注意:
该方法,会在被调用时自动获得当前的sessionid
该方法,需要返回字符串,即使没有获取成功,也需要空字符串!
该方法,仅仅需要返回字符串数据即可,不需要对其反序列化,系统会处理。
1.10.1.3,写操作
Replace into语法上与
insert into一致
如果主键(唯一键)冲突,则会选择执行替换更新操作,如果未冲突,就是insert。
If (select)
Update
else
Insert
Unix_timestamp();
测试:
写成功了:
读呢?测试读操作
1.10.1.4,删除
1.10.1.5,垃圾回收Gc
如果字段参与运算,最好独立在不等式的一侧,可以更好的利用该字段上的索引(如果有)
Alter table session add index (last_write)
1.10.1.8,重新设置配置项session.save_handler
session.save_handler:表示存储处理机制
默认的:
表示以文件的形式存储。
修该改为user,表示:表示自定义!
1.10.1.9,先设置session_set_save_handler(), 再开启session
切记:关闭session的自动开启。
配置项:session.auto_start表示自动开启!
1.10.2,二:将其告知给PHP程序
函数:
session_set_save_handler(开始,结束,读,写,删除,垃圾回收);
每个参数,就是回调函数(函数标志类型的参数)!
1.10.3,三:常规使用session即可:
开启session,操作$_SESSION;
2,会话技术综述
2.1,Session pk cookie?
联系:
都是会话技术的实现。
Session基于cookie,session的session-id存储于cookie中。
差异:
| Cookie | Session |
会话数据的存储位置 | 浏览器端 | 服务器端 |
安全性 | 低 | 高 |
传输会话数据量 | 多 | 少 |
对数据类型的支持 | 仅字符串 | 序列化存储,全部数据类型(资源不行) |
2.2,cookie禁用,session如何处理?
正常情况:cookie禁用,session也不能用!
理论情况:
只要能过每次请求向服务器传输session-id,那么没有cookie也可以…
通过,url(get)或者表单元素(post),向服务器传递session-id即可。
Php,支持配置通过非cookie方式传递session-id的(公共环境不建议设置)
两个配置项:
是否仅仅使用cookie传递session-id:
是否自动通过非cookie的方式传递session-id:
测试:
设置浏览器不支持cookie:
页面入下:
结果:
Html代码被更新为添加session-id:
2.3,如何持久化session?
理论上:
一:持久化cookie中的session-id。
二:延长对session垃圾的判定时间。
Session_set_cookie_params(24*3600);
Ini_set(‘session.gc_maxlifetime’, 24*3600);
没这么做的。Session不需要持久化。
服务器的session处理压力增大!
建议:需要持久化存储会话数据,选择cookie!
会话:session。
以上是关于求php session新手入门教程的主要内容,如果未能解决你的问题,请参考以下文章