【重要:4】php session阻塞页面分析及优化 (session_write_close session_commit使用)

这个问题很多做php开发朋友应该都有遇到过,一个启用了session_start 页面,由于执行时间过长。导致通一个用户访问,另外一个很简单的启用session_start页面一直阻塞着。 直到第一个页面执行完了。第二个页面就可以读取。这个就是,我们常说的,session阻塞机制

这个问题很多做php开发朋友应该都有遇到过,一个启用了session_start 页面,由于执行时间过长。

导致通一个用户访问,另外一个很简单的启用session_start页面一直阻塞着。 

直到第一个页面执行完了。第二个页面就可以读取。

这个就是,我们常说的,session阻塞机制。


#我用file 存放用户session 


session默认以文件保存,当一个用户访问session_start页面后,这个时候,就会默认创建一个包含session_id文件名,并且这个时候,会对文件进行锁定

如果这个用户点击链接,又访问一个该站session_start网页。

这是,由于session_id一样,这个页面也要读取锁定该用户存放session文件。 

由于,第一个页面没有执行完,它一直锁定了该文件。 第2个页面就不能获取锁,一直处于等待状态。

这样一个看似小的问题,实际上,如果网站上面有大量用户访问,会导致session读取文件一直阻塞等待着。

用户浏览器一直跟服务器保持连接,会消耗很多服务器资源。

web服务器活跃连接数也会增大,可能很快就会耗费完连接资源,出现拒绝服务器。



#我用memcache 存放用户session 


用memcache保存用户session,相比读取文件有很大速度提升。

而且可以做到多服务器共享session。

确实很方便,这个时候,我们发现不会出现用文件保存session锁定清理。

memcached读取时候,是共享的,不会出现等待。

但是,我们会发现,memcached连接数,还是会保持着。

并且,连接数会增加,如果这个时候,你设置的memcached连接数过小,你会发现,很快memcached就挂死了。 

这也是,做memcache接管session时候,经常遇到问题。 

有时候,web服务器很多,session(memcache)很少。

发现memcache莫名其妙死掉,可能跟这个有关系。

太多反映很慢的页面(启动session),会导致占用了大量memcached连接数。



#改变session使用习惯、优化调用方法


其实,通过file或者session,如果处理耗时页面,都会带来服务器资源很大消耗。

其实我们一般写入session或者读取时候,如果自己能够控制。

用完了,就关闭掉文件锁,或者mem连接。

就会自动释放资源,其实,php里面的:session_write_close,session_commit 函数就能做到该功能。