Session锁和session_write_close和session_commit函数

来源:互联网 发布:阿里巴巴用什么数据库 编辑:程序博客网 时间:2024/06/05 16:14

session默认是文件存储,也可以存在数据库和内存,存入内存可以使用Memcached和Redis技术

Session默认存在文件中,在这种情况下:使用session_start()函数之后就会对该sessionId文件锁定,

直到还脚本执行完毕才存入文件和解锁,

当一下情况会非常耗时:

1:一个页面有多个ajax请求,并且多个ajax请求页都涉及到session,即都得操作同一个session文件,

由于锁定ajax的执行必须是逐个执行的。

2:同时访问一个网站的多个页面,各个页面都涉及session操作,这样也得逐个页面的执行

3:等等这样一个看似小的问题,实际上,如果网站上面有大量用户访问,会导致session读取文件一直阻塞等待着。用户浏览器一直跟服务器保持连接,会消耗很多服务器资源。web服务器活跃连接数也会增大,可能很快就会耗费完连接资源,出现拒绝服务器。

如果存入数据库或内存,则这些数据就是共享的可以同时读取。如Memcached,我们发现不会出现用文件保存session锁定清理。memcached读取时候,是共享的,不会出现等待。但是,我们会发现,memcached连接数,还是会保持着。并且,连接数会增加,如果这个时候,你设置的memcached连接数过小,你会发现,很快memcached就挂死了。 这也是,做memcache接管session时候,经常遇到问题。 有时候,web服务器很多,session(memcache)很少。发现memcache莫名其妙死掉,可能跟这个有关系。太多反映很慢的页面(启动session),会导致占用了大量memcached连接数。

其实,通过file或者session,如果处理耗时页面,都会带来服务器资源很大消耗。其实我们一般写入session或者读取时候,如果自己能够控制。用完了,就关闭掉文件锁,或者mem连接。就会自动释放资源,其实,php里面的:session_write_close,session_commit函数就能做到改功能。


session_commit是session_write_close的别名,功能是:前面的session数据存入或读取,然后关闭session,释放锁定资源,其他的session_start可以执行。

原创粉丝点击