PHP中使用数据库保存session

论坛 期权论坛 脚本     
匿名技术用户   2020-12-30 07:49   11   0

如果你在线阅读有困难,则可以下载附件,附件中包含了本例程的PDF手册,完整示范代码 ,如果找不到示范代码,则你可以致邮件到 zhangxugg@163.com向作者索取源码, 谢谢


1.为什么要使用数据库来保存session ?
有几点原因,建议你用数据库来保存session :
一是站点的用户量比较庞大,可能数千用户同时在线;
二是你需要统计在线用户的信息,比方人数,等级,目前处于哪个页面等有用信息, 如果你具备上面任何一个因素,则建议使用数据库来保存session ;目前,流行的BBS, CMS, website 几乎全是用数据库来保存session;
三是你可能需要session信息跨服务器共享,那么保存在数据库中无疑是最为理想的;具体多台服务器如何共享session的实现技术,并非本文重点;在实现之前,你得先弄懂如何用数据库保存session就行了;
如果你是好学的,那么你应该仔细阅读本文.

2.PHP在默认条件下是怎么保存session?

声明一个概念: session数据是保存在服务器上的,cookie是保存在用户的磁盘上的, 请不要给我说: session是保存在本地的,那样只会让我愤怒并说明你的浅薄与无知.

PHP默认情况下是将session保存在文本文件中的, 比如,在我的 windows , 我的php安装在 d:\wwwroot\php\ 下的,里面有一个session目录,你会发现它里面有很多奇怪的文件文件名是无序的,没有后缀名,其实这就是session的保存位置了,只不过是文本文件而已,你可以用记事本打开它,以满足你的好奇心. 其实,这里的文件名就是session_id,对应文件的内容则是
相应session的值序列化后保存下来的 ;
在用户比较少的情况下,这会工作得很好,但是当用户非常多的时候, 那么想想,一个目录下保存成千上万个文件,将会使操作系统读取文件变得非常缓慢从二而严重影响性能;
不信?那你可以在windows的某个目录下建立10000个空文件,然后在explorer中打开它,观察windows的反应速度.

3.如果修改PHPsession保存方式?

PHP
提供了session_set_save_handler用来改变默认的session保存方式 ,查看手册说明如下定义:

bool session_set_save_handler ( callback $open, callback $close, callback $read, callback $write, callback $destroy, callback $gc )



返回的是bool类型,参数全是一些回调函数,如果你还不知道什么是回调函数,请自己查阅相关的资料弄懂它, www.google.com也许是你最好的老师 ;当你使用session,会发生以下session事件:

Open : 当你呼叫session_start() 时触发这个事件,在任何使用session,必须得呼叫此函数;
close : 当页面执行完毕时,触发这个事件;
read , write当你呼叫session_start(),先会激活read事件,随后,在页面结束前,会激活write事件,以便将session信息保存到媒介中;
destroy : 执行unset($_SESSION[‘key’]) ,将激活此事件
gc : 垃圾收集,即清理超时的session,既然是数据库保存,你最好手工执行session清理,以确保session信息的正确
未经许可,均可自由转载,但请注明作者信息;

请下载附件,详细阅读

谨以此献给我最爱的妹妹,谢谢你一直对我支持与理解!



[ 本帖最后由 xuer 于 2008-4-18 09:01 编辑 ]

session.zip
(2008-04-17 19:34:02, Size: 209 KB, Downloads: 326)

lamengao (2008-4-17 20:12:25)
收藏
guoguolovePHP (2008-4-17 21:43:56)
不错 学习
edwardhey (2008-4-17 22:57:19)

QUOTE:

1.为什么要使用数据库来保存session ?
有几点原因,建议你用数据库来保存session :
一是站点的用户量比较庞大,可能数千用户同时在线;
二是你需要统计在线用户的信息,比方人数,等级,目前处于哪个页面等有用信息, 如果你具备上面任何一个因素,则建议使用数据库来保存session ;目前,流行的BBS, CMS, website 几乎全是用数据库来保存session;
三是你可能需要session信息跨服务器共享,那么保存在数据库中无疑是最为理想的;具体多台服务器如何共享session的实现技术,并非本文重点;在实现之前,你得先弄懂如何用数据库保存session就行了;
如果你是好学的,那么你应该仔细阅读本文.

你说的只有第三点是正确的,而往往第三点没有解释清楚。。。
1、数千人同时在线就要用数据库存session了?你测试过了么?
那么你尝试过把session文件打散来处理了么?如果打散效率是不是会比存库更高呢?还要走http协议,联库的资源是很宝贵的

2、如果只为了实现这个功能,我建议使用memcache


我建议把文章标题改成session原理更合适~ 呵呵~ 没有敌对的意思~ 只是建议

duyipeng (2008-4-24 16:42:44)
谢谢,受教了俄~~
wangchun (2008-4-24 16:52:52)

QUOTE:

原帖由 edwardhey 于 2008-4-17 22:57 发表

你说的只有第三点是正确的,而往往第三点没有解释清楚。。。
1、数千人同时在线就要用数据库存session了?你测试过了么?
那么你尝试过把session文件打散来处理了么?如果打散效率是不是会比存库更高呢?还要走h ...
正确,数据库保存session我感觉唯一的好处就是统计方便,其他的都是扯淡,大数据量数据库保存session就是一个噩梦,还是memcache保存session比较好。mysql更新的时候要锁表,虽然平时我们感觉不出来,但是流量大了是非常恐怖的,一个select session会达到2秒(平时0.001x),phpmyadmin打开看看进程,全市lock table和waiting

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP