php中session的处理机制 (转)
1。
? php服务端默认的session存储是文件存放方式,在windows上php默认的session服务端文件存放在c:\windows\temp下,可用session_save_path ('./t/');指定具体存放目录。
2。
? 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主机则无此功能。
3。
session_start() :开始一个会话或者返回已经存在的会话。
在使用session_start()之前浏览器不能有任何输出,否则会发生以下错误。
你可以在php.ini里启动session.auto_start=1,这样就无需每次使用session之前都要调用session_start()。
4。
如果在session.auto_start=1,会让session_save_path ('./t/');变的无效。因为后一条语句须放前面。
5。
保存在服务器上的session文件,没有遇到session_destroy();,不会被删除。
即使客户端浏览器已关闭。
不过服务器端每次产生的session文件都能保证session文件名的随机性和唯一性。
6。http://www.toplee.com/blog/300.html
增加php的session存储和处理能力
可能很多phper都用到了php提供的session功能,可以方便的进行会话功能处理,php服务端默认的session存储是文件存放方式,在windows上php默认的session服务端文件存放在c:\windows\temp下,*nix下默认存放在/tmp下,如果说并发访问很大或者session建立太多,在这两个目录下就会存在大量类似sess_xxxxxx的session文件,同一个目录下文件数过多会导致性能下降,并且可能导致受到攻击最终出现文件系统错误。针对这样的情况,php本身体提供了比较好的解决办法。
不少朋友可能都没有注意到php.ini里面session设置部分中有这样一项:
; session.save_path = n;mode;/path
这项设置提供给我们可以给session存放目录进行多级散列,其中“n”表示要设置的目录级数,“mode”表示目录的权限属性,默认为600,在 windows上基本是不用设置的,*nix上也可以不用设置,后面的“/path”表示session文件存放的根目录路径,比如我们设置为下面的格式
session.save_path = 2;/tmp/phpsession
上面的设置表示我们把/tmp/phpsession目录作为php的session文件存放根目录,在该目录下进行两级目录散列,每一级目录分别是0-9和a-z共36个字母数字为目录名,这样存放session的目录可以达到36*36个,相信作为单台服务器来说,这是完全够用了,如果说您的系统架构设计为多台服务器共享session数据,可以把目录级增加到3级或者更多。
需要注意的是,php自己并不会自动创建子目录,需要您自己动手去创建,网上找到这样的自动创建目录的代码,大家可以做个参考。下面的代码自动创建3级子目录,可以自己动手根据需要进行修改。
大家可能注意到前面的文字中提到了有关多服务器共享php的session,这是很多应用都会遇到的问题,网上也有不少相关的资源,大家可以去google一下,michael这里只提一下大概的思路。
一般来说我们用到最多的方法有两种:
1、nfs或者samba共享的方法,让各个服务器上存放session文件的磁盘共享,这种方法简单可行。
2、集中存储到数据库中,这是比较多的实现方法,通过php提供的session_set_save_handler()函数来重定义session函数,推荐使用这种方法。
转自:http://www.phpweblog.net/fuyongjie/archive/2009/06/09/6687.html