如果你在线阅读有困难,则可以下载附件,附件中包含了本例程的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.如果修改PHP的session保存方式?
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)
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
|
|