文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>session机制的论述!!以及和cookie的比较!

session机制的论述!!以及和cookie的比较!

时间:2007-02-17  来源:PHP爱好者

[b:8e83c11df9]我虽然接触php的时间也不短了,但我在php中却对session和cookie却在具体的编程中没有用过。

我最早认识session和cookie的概念还是三年前学习asp知道的,后来一直没用过。
在asp中还有applaction的概念。在我的脑海中,applaction和seesion都是服务器上存储机制,applaction(在php似乎没有这个概念,当我在asp中用这个编过计数器)对于每个浏览者是共享的,而seesion是每个用户都有自己的session。他们的生命周期一般是用户打开某网站浏览器到关闭与次网站连接所有的浏览器后结束。cookie这是在用户端的存贮机制,他需要用户的大开cookie支持,

目前在用户注册登录时,我觉得有必要用到session。需要对此进一步了解。[/b:8e83c11df9]
在php中有关session的函数主要有如下这些:
session_start: 初始 session。 
session_destroy: 结束 session。 
session_name: 存取目前 session 名称。 
session_module_name: 存取目前 session 模组。 
session_save_path: 存取目前 session 路径。 
session_id: 存取目前 session 代号。 
session_register: 注册新的变数。 
session_unregister: 删除已注册变数。 
session_is_registered: 检查变数是否注册。 
session_decode: Session 资料解码。 
session_encode: Session 资料编码。 
[b:8e83c11df9]
但是我觉得函数不是关键的问题,主要是先搞清session到底是怎样的机制。我稍微看了一下有关的资料。给人的感觉是session其实是在服务器端的tmp目录下的某一个文件中为每个用户储存一些变量,对session的操作其实是对文件读写操作。请有关高手高谈阔论![/b:8e83c11df9]     

[b:8e83c11df9]我想知道tmp目录到底放在哪里呢,我好像在win2000用搜索找不到tmp目录。只有temp[/color:8e83c11df9]目录[/b:8e83c11df9]     

[b:8e83c11df9]如下的代码在我本地机上会出现错误警告信息,上传到my8868.com
网站(我在虎翼的服务器)上没问题。我想可能是tmp目录所在的目录的权限没有弄好,当有不知道tmp目录所在的地方[/b:8e83c11df9]
<? 
echo session_save_path();
session_start(); 
session_register('count'); 
$count++; 
echo "<P>You've been here $count times.</p>"; 
?> 

[b:8e83c11df9]/tmp
Warning: Cannot send session cache limiter - headers already sent (output started at c:inetpubwwwrootmy8868test.php:2) in c:inetpubwwwrootmy8868test.php on line 3

Warning: open(/tmpsess_5a0e8bd0b49308a4abf652cbff6fcd1b, O_RDWR) failed: m (2) in c:inetpubwwwrootmy8868test.php on line 3

You've been here 1 times.

Warning: open(/tmpsess_5a0e8bd0b49308a4abf652cbff6fcd1b, O_RDWR) failed: m (2) in Unknown on line 0

Warning: Failed to write session data (files). Please verify that the current setting of session.save_path is correct (/tmp) in Unknown on line 0[/b:8e83c11df9]     [/color:8e83c11df9]     

[b:8e83c11df9]现在我已经知道上面引起的原因了!Cannot send session cache limiter - headers already sent 是由于在前面有echo[/color:8e83c11df9]
Warning: Failed to write session data (files). 是由于
在windows2000+IIS下,没有php.ini文件。session_save_path没设置。     [/b]   我在win2000+IIS下没有php.ini也可以正常运行!??? 
我的系统是win2000+IIS,没有想常规一样把php.exe和php.ini文件复制到winnt目录下,把dll文件拷到system32目录下,但是ph可以很好的运行,是不是在没有php.ini配置文件的情况下win2000+IIS,会调用一个默认的配置文件? 
但是我最近想使用session的功能,出现上面的警告信息:后来加上php.ini文件并把session.save_path = c:/temp 
默认为session.save_path = /tmp 
并在c:目录下建一个temp 目录,它的权限为可读写!就行了!     [/b:8e83c11df9]     

在php中,seesion的机制是文件,还不是想asp那样是对象的概念,也不是放在内存,觉得在session就像存储在文件里一个全局变量。而且需要session cookie的配合。(即如果客户端cookie关掉就不行了,虽然url的方式也可以)session最对提供了方便管理全局变量的方式,其实自己用文件操作可以实现,在速度方面好像没有优势。[/color:8e83c11df9]

 baorongabc 回复于:2003-07-06 11:12:22 [b:2e98cfc298]请大家都来谈谈自己的对session有关认识!     [/b:2e98cfc298][/color:2e98cfc298][/size:2e98cfc298]

星月无痕 回复于:2003-07-06 22:26:36 不会

wubai 回复于:2003-07-07 08:38:38 说的不错!

redfox 回复于:2003-07-07 12:43:32 方便性也是一方面,用地址栏自然没有用session方便了;而且地址栏长度有限制的,session可以传数组,甚至大的对象都可以。

baorongabc 回复于:2003-07-07 13:17:18 [b:03c3ca8536]对session的认识的补充![/b:03c3ca8536][/size:03c3ca8536][/color:03c3ca8536][b:03c3ca8536]session在各个窗口是如何运行。[/color:03c3ca8536][/b:03c3ca8536]     
[b:03c3ca8536]我先来做个试验[/b:03c3ca8536]我php版本是4.02,[/color:03c3ca8536]
首先我们来建立两个文件。

test1.php 
<?
session_start(); 
session_register("count"); 
echo $count=0; 
?> 

test2.php 
<?
session_start(); 
echo $count++; 
?> 

[b:03c3ca8536]打开两个浏览器窗口,标记为A和B
在A浏览器的窗口中执行test1.php,这时我们应该看到浏览器中显示的值是0。这时在tmp目录下会生成一个文件名为sess_72449e735acfa944d629d05f12e26d81的文件。内容count|i:0;
继续在A浏览器的窗口中执行test2.php,并不断的刷新它,我们就会看到浏览器中的数值在不断的递增,这时在tmp目录下仍然是只有上面那个文件名,内容count的值变化了,说明我们的session是起作用的。我们继续看看其他的情况,在B浏览器的窗口中执行test2.php,没有显示,继续刷新,仍没有显示。这时在tmp目录下会生成一个文件名为sess_26c0deb5b640cd9d9466b174dc051816,内容为空!再打开第三个浏览器窗口C并在其中执行test2.php,也是没有显示,这时在tmp目录下会生成一个文件名为sess_8b6934cd6a2f5a60e3d1c4eca9b3609e。这说明session不能跨窗口运行。并且每个窗户生成一个文件     [/color:03c3ca8536][/size:03c3ca8536]如果在A窗口用文件》》新建窗口得到窗口D时,刷新,浏览器中的数值在不断的递增  ,sess_72449e735acfa944d629d05f12e26d81  内容count的值变化了,所以窗口具有继承性!session可以在 继承的窗口传递。[/size:03c3ca8536][/color:03c3ca8536]    [/b:03c3ca8536]  

可是问题有出来了,我把这两个文件上传到我网站做试验,
www.my8868.com
结果是不同的窗口也可以传递!我不知它的php版本是怎样以及php.ini是如何配置的,   [/color:03c3ca8536][/size:03c3ca8536] 
后来我有发现,www.my8868.com网站上session的保存期好像是永远,我关掉所有连接此网站的窗口,重新打开网页,session的值还是保存着,电脑用户注销后,也是不消失,重新启动也一样,但同样是这些文件在我机子上执行,session的值消失了。这里又出[/color:03c3ca8536]来一个session生命周期的问题[/size:03c3ca8536][/color:03c3ca8536]。这样session与cookie不是一样了吗,在我的印象中session的生命周期应该是从用户连上服务端网站到用户离开结束。如果session的生命周期可以变化,而且是需要cookie session的支持,又是读文件操作,效率不高,还不如用cookie实现有关功能,在我看来seesion没有什么作用,其他人有没有其他的看法![/color:03c3ca8536]

[b:03c3ca8536]我的留言版
http://www.my8868.com/second_folder1/message_board/message_board_index.php
的用户注册功能的实现,我首先想到是用session的机制,因为在以前的印象中seesion是服务器端,执行速度一定比cookie快,不需要受客户端的限制,(因为cookie在用户端关掉cookie支持后就不能用了)可是现在发现 session也需要cookie机制的支持,所以我真怀疑php中session的优越性!用户注册 ,网上购物,这些系统应该是用se'ssion的,可是.....
你们会选择用session还是cookie。[/b:03c3ca8536][/size:03c3ca8536]     [/color:03c3ca8536]

mfk21 回复于:2003-07-07 14:16:19 session用的好的话,还可以。如果用不好的话,问题真是多多啊,我是深有感触啊!

daoker 回复于:2003-07-07 21:29:54 我一直用cookie

redfox 回复于:2003-07-08 07:59:13 session的生命周期可以在php.ini修改阿。

mostone 回复于:2003-07-08 13:18:32 session是针对每一个用户的,变量的值保存在服务器上,但是如何区分是哪个用户session变量呢,这里就有一个sessionID,这个值是通过用户的浏览器在访问的时候返回给服务器,当客户禁用cookie时,这个值也可能设置为由get来返回给服务器。目前,有的浏览器的sessionID不能跨页,有的可以,如IE,MYIE2对session的处理是不同的,后者只要你开过这个网站的页面,即使关闭后(指关闭子窗口,它是多页面浏览器),再重新打开,sessionID依然存在,而无需重新注册。sessionID是经过加密,加密算法比较复杂,被黑的可能性很小,而cookie是保存在客户机子上,安全性较差。另外,如楼上所说,session可以设置有效或无效,可手工建立,也可自动建立,可以设置过期时限。
另外,你所说的tmp可能只是环境变量而已,不是一个物理目录,可设置指向到用户物理的临时目录。

tanghui21 回复于:2003-07-08 19:23:23 我也很想问这个问题 多谢楼主

baorongabc 回复于:2003-07-09 10:16:25 cookie和seesion的比较![/size:dcc878e49b][/color:dcc878e49b]
精灵王feming在置顶的有关cookie的两篇文章写得很好,对cookie的阐述的很清楚!希望大家也去看看!
但是她写道cookie存在下面这些问题:
比如:MS IE+SERVICE PACK 1不能正确处理带域名和路径的Cookie,Netscape Communicator 4.05和MS IE 3.0不能正确处理不带路径和时间的Cookie。至于MS IE 5 好象不能处理带域名、路径和时间的Cookie。这是我在设计本站的页面时发现的。 
第三个限制是在客户端的。一个浏览器能创建的Cookie数量最多为30个,并且每个不能超过4KB,每个WEB站点能设置的Cookie总数不能超过20个。     [/color:dcc878e49b]
[b:dcc878e49b]觉得是cookie的致命伤!这样在编程如何处理这些不兼容问题,不得不考虑用session。 [/b:dcc878e49b][/color:dcc878e49b]     

[b:dcc878e49b]精灵alex2003 说:
首先,cookie 和session是密切相关的。session 和cookie相比有好处,但也有不好的地方: 
如果服务器端是多台服务器,采用负载均衡方案,session就有问题了。因为不能保证每次请求都由同一台服务器处理,这样就会出现session丢失的情况。因此在这种情况下,还是应该使用cookie,这在大型网站上很常见。 
希望大家注意!
显然session在多台服务器,采用负载均衡方案存在问题,那上面cookie的问题如何解决?[/b:dcc878e49b][/color:dcc878e49b]

baorongabc 回复于:2003-07-09 12:13:11 seesion几个函数的注意点:[/color:b17c42b8a1][/size:b17c42b8a1]
1 session_start()
本函式初始化一个新的 Session,若该客户已在 Session 之中,则连上原 Session。本函式没有参数,且传回值均为 true。
[b:b17c42b8a1]其实在tmp目录下创建像sess_26c0deb5b640cd9d9466b174dc051816的 存放session文件,是随机数,sess后的数可以用 session_id()取得[/b:b17c42b8a1]。

2 session_id()
存取目前 session 代号。
语法: string session_id(string [id]);
传回值: 字串
本函式可取得或者重新设定目前存放 Session 的代号。若无参数 id 则表示只有取得目前 Session 的代号,加上参数则表示将 Session 代号设成新指定的 id。输入及传回均为字串。
[b:b17c42b8a1]如果string [id]部位空,在tmp目录下创建将创建名string的文件。但如果在前面也用了session_start(),将同时产生两个文件,一个是随机名文件,一个是名string的文件。如果你不想产生随机文件,请去掉session_start(),注意session_id()函数的string好像的好像只能是数字和字母,不能是_#-:等特殊字符,这是我是试出来的。[/b:b17c42b8a1]   

[b:b17c42b8a1]这里现在我有一个问题:
我用session_id(“文件名”)建立session后怎样取得此文件中session???
其实再用session_start(),因为如果当前的session已经存在,将不会产生新的文件。两者前后顺序是很讲究的。 [/b:b17c42b8a1]

hillwood 回复于:2003-07-09 17:58:51 你这个介绍没有人能看到

feming 回复于:2003-07-10 00:10:16   当开发人员使用Session变量时必须要求客户端浏览器支持接受cookies,当ASP开始一个Session,它将送一个cookies到客户端并带一个标示(SessionID).通过这个标示,ASP以后将可以确认Session并且因此来保持状态。所以,当你使用Session变量前,你需要确认cookies是否被接受。这里我讲解两个方法:

方法一:
  无论何时你在两页之间,有一个非常简单可靠的方法:请求一个SessionID在第一页,传递它到下一页。与这一页请求到的SessionID比较。相同说明客户端浏览器接受Cookies;不同则不接受。很简单吧。
  比如你可以在第一页中放一个(hidden field),并把SessionID写入它。提交后,从页面数据中取出SessionID.像这样:
<form name="Form1" method="post" action="sessions2.asp">
UserName:<input name="username"><br>
Password:<input name="userpassword">
<input type="hidden" name="theSessionID" value="<%=Session.SessionID%>"><br>
<input type="submit" value="Submit">
</form>
  在第二页中我们来判断SessionID是否相同。
<%
dim theSessionID
theSessionID = Request.Form("theSessionID")
If theSessionID = Session.SessionID Then 
"当二者相等时,则cookie功能开启
Response.Write "Cookie已开启"
Else 
"若二者相等时,则cookie功能关闭
Response.Write "Cookie没有开启!"
End If
%>

方法二:
  也可用这种方法,首先在一个页面里写入一个cookie,如:
<%
Response.Cookies("status")="onoroff"
%>
  在第二页里读出此cookie:
<%
if Request.Cookies("status")="" then 
"当cookies("status")里没有值时,则cookie功能没有开启
Response.Write "Cookie没有开启!"
else
"当cookies("status")里有值时,则cookie功能开启
Response.Write "Cookie已开启"
end if
%>

alex2003 回复于:2003-07-10 09:24:17 首先,cookie 和session是密切相关的。session 和cookie相比有好处,但也有不好的地方:
如果服务器端是多台服务器,采用负载均衡方案,session就有问题了。因为不能保证每次请求都由同一台服务器处理,这样就会出现session丢失的情况。因此在这种情况下,还是应该使用cookie,这在大型网站上很常见。
希望大家注意!

baorongabc 回复于:2003-07-10 09:58:09 [b:2636295da6]session的生命周期有多长?如何设置? [/b:2636295da6][/size:2636295da6][/color:2636295da6]
浏览器结束时其生命周期也同时结束,但是档案仍然存在于 /tmp/(sess_???) 

下次重新开浏览器时会重新分配 sessionID,如果你使用 session_id() 把以前的 ID 带回来,则会去读取残存在 /tmp 处的 sess_???, 取回你之前所有已经设定的参数 

可以在 php.ini 里修改 session 档案残存的时间 
session.gc_maxlifetime = 1440 ; after this number of seconds, stored 
; data will be seen as 'garbage' and 
; cleaned up by the gc process 
默认是 1440 秒,24分钟

baorongabc 回复于:2003-07-11 07:35:01 [b:5812b959ea]我不知道这个论坛是用什么机制编程,我想应该是cookie机制吧!
在这里存在安全问题!
如果我在这个论坛,登录时,在【】是否自动登录 复选框中选择后,下一次我就打开网页后,就已经登录了,这时可以进行个人资料管理!
如果其他人,打开此网页,那他不是可以修改我个人资料。甚至把我密码改掉,那我用户不是被人 盗用    了吗?     [/b:5812b959ea][/color:5812b959ea]  

[b:5812b959ea]还有这个论坛存在一个格式化显示问题!
给对空格的处理没有处理好,连续的空格将变成一个, 顶格空格被去掉!
处理方法很简单,只要加个字符处理函数对从数据库中取出内容字段进行处理就行!!  [/b:5812b959ea][/color:5812b959ea]

tjyihui 回复于:2003-07-13 20:45:41 采用cookie时如果设置不当会出现一些安全隐患
因为cookie是保存在客户端的,凡是使用这台机器的人都可以查看到cookie的内容,如果在设置cookie时直接写入没有加密的密码(如www.deskcity.com就是这样),那么很容易被别人盗取,即便采用一些加密方法如base64,md5,如果密码设置得太简单,也会被穷举法所破解。
更何况还有通过设置本机的host文件来进行cookie欺骗以及针对cookie的跨站脚本攻击(详细内容可见7月份的《黑客防线》)等等。
可以说有关cookie的安全问题就够研究一阵的了!

redfox 回复于:2003-07-14 08:43:17 session更安全些,且便于用程序控制,用cookies总有一种不受控制的感觉,缺乏安全感 

benchozhang 回复于:2003-07-18 22:55:34 [quote:6dd9bd7330="baorongabc"][/quote:6dd9bd7330]   

我按照以上测试程序,即
test1.php 
<? 
session_start(); 
session_register("count"); 
echo $count=0; 
?> 

test2.php 
<? 
session_start(); 
echo $count++; 
?> 

测试步骤也一样,
在A浏览器的窗口中执行test1.php,这时我们应该看到浏览器中显示的值是0。这时在tmp目录下会生成一个文件名为sess_72449e735acfa944d629d05f12e26d81的文件。内容count|i:0; 

“继续在A浏览器的窗口中执行test2.php,并不断的刷新它,我们就会看到浏览器中的数值在不断的递增,这时在tmp目录下仍然是只有上面那个文件名,内容count的值变化了,说明我们的session是起作用的。”
这个步骤中,在A浏览器的窗口中执行test2.php,并不断的刷新它,并不是预料中的显示不断增加的数值,而是什么也没显示,就是说A中注册并赋值的session并没有带到test2.php,而是每一次刷新,在temp下都生成一个session的文件。在A浏览器的窗口中执行test1.php,不断刷新,也是每一次刷新,再temp下都生成一个session的文件。请问为什么会这样不断生成session文件呢?是不是我的session有问题?

baorongabc 回复于:2003-08-07 16:51:22 ――――test.php文件―――――――――――――
<?
session_id("aa");
session_start();

session_id("bb");
session_start(); 

$s_id=session_id();
session_register("s_user_id");
$s_user_id=1;
echo $s_id."<br>";
?>
<a href="test1.php">test1</a>

―――test1.php文件――――――――
<?

session_start(); 
$s_id=session_id();
echo $s_id."<br>"; 
?>

session_start()函数如果客户不在session之中时初始化一个新的session,若该客户已在session之中,则连上原session。本函式没有参数,且传回值均为 true。
session_id(string [id])本函式可取得或者重新设定目前存放session的代号。若无参数id 则表示只有取得目前session的代号,加上参数则表示将session代号设成新指定的id。输入及传回均为字串。
session_register(string name)本函式在全域变数中增加一个变数到目前的session之中。参数 name 即为欲加入的变数名。成功则传回 true 值。如果客户不在session之中时初始化一个新的session。
在session_start()和session_register(string name) 初始化一个新的session的id値可以由session_id(string [id])控制。如果不加session_id(string [id]),生成的session_id値为形如74a574990ea6f81da62cc4337877eabe的随机数。
所以像上面的程序的结果是:
在session存放的目录下生成sess_aa 和sess_bb两个文件,sess_aa文件中无参数,sess_bb文件中s_user_id|i:1;
如果把 session_id("aa");
session_start();
session_id("bb");
session_start();      
变成 
session_start();     ―――   句1
session_id("aa");   ―――   句2         
session_id("bb");  ―――   句3
session_start();  ―――   句4
在session存放的目录下会生成一个像sess_74a574990ea6f81da62cc4337877eabe文件(不一定就是这个値)和sess_bb两个文件。因为句1产生sess_74a574990ea6f81da62cc4337877eabe文件,句2设置session_id的値被句3代替,即session_id的値为bb,所以句4生成sess_bb文件。

这些我已经很清楚明白了,但是这里我存在一个问题!在点击test.php超级连接到test1.php时echo $s_id."<br>";$s_id値为aa,而不是bb,这使我感到意外。似乎session_id("bb")没有把当前的session_id的値变成bb还是保留为aa。我现在真的还找不到原因。请大家帮忙!

arccreator 回复于:2003-08-08 16:44:24 如果你使用 sniffer 监听你的浏览器作了些什么,你抓就清楚了,
当你访问一个用session 的站,同时在自己机子上建立一个cookie,cookie的名字是phpsessid=2323.......324df. 这个值和服务器上的session id 相符的文件里存放的是你的信息,如果黑客能抓到你的http请求包,伪造一个,就相当于使用了你的浏览器了

willsee 回复于:2003-08-08 17:08:16 是啊,我现在也在学php
发现cookie和seesion的问题最多
哎,,,,,,,,
现在卡在这里了,好文章,希望我以后有
问题可以找你

kevinlei 回复于:2003-08-15 06:35:45 我是尽量不用SESSION,这东西真的不是想象中的那么好用,我感觉,一般情况下COOKIE基本上够用了。我想要是W3C把COOKIE的标准扩展一下,应该就没SESSION什么事了。
php爱好 者站 http://www.phpfans.net php基础|php进阶|php模板.
相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载