登录 |  注册 |  繁體中文


session锁和session_write_close函数

分类: php 颜色:橙色 默认  字号: 阅读(3617) | 评论(0)

最近在做数据统计的项目,突然发现进入数据展示页面后,再点菜单上的任何页面,都会发生卡住的现象,一开始以为是服务器的问题,后来用xdebug + WinCacheGrind 分析,原来页面一直卡在 session_start()上。

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

session默认以文件保存,当一个用户访问session_start页面后,这个时候,就会默认创建一个包含session_id文件名,并且这个时候,会对文件进行锁定。如果这个用户点击链接,又访问一个该站session_start网页。这时,由于session_id一样,这个页面也有读取锁定该用户存放session文件。 由于,第一个页面没有执行完,它一直锁定了该文件。 第2个页面就不能获取锁,一直处于等待状态。所以页面就”卡住了“。

以下情况会非常耗时:

1:一个页面有多个ajax请求,并且多个ajax请求页都涉及到session,即都得操作同一个session文件,由于文件被锁定,ajax的执行必须是逐个执行的。

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

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

如果存入数据库或内存,则这些数据就是共享的可以同时读取。如Memcached,我们发现不会出现用文件保存session锁定清理。memcached读取时候,是共享的,不会出现等待。

其实我们一般写入session或者读取时候,如果自己能够控制。用完了,就关闭掉文件锁,或者mem连接,那资源就会自动释放, php里面的:session_write_close, 函数就能做到此功能。


session_write_close的功能是:把前面的session数据存入到文件里面,并释放 sesseion_id文件资源。

< ?php        
  //只读取session时
  session_start();  
  session_write_close();    
  echo $_SESSION["message"];       


   //写入session时
  session_start();    
  $_SESSION["message"]="abc";       
  session_write_close();    
?>



姓 名: *
邮 箱:
内 容: *
验证码: 点击刷新 *   

回到顶部