这个问题不少作php开发朋友应该都有遇到过,一个启用了session_start 页面,因为执行时间过长。致使通一个用户访问,另一个很简单的启用session_start页面一直阻塞着。 直到第一个页面执行完了。第二个页面就能够读取。这个就是,咱们常说的,session阻塞机制。php
session默认以文件保存,当一个用户访问session_start页面后,这个时候,就会默认建立一个包含session_id文件名,而且这个时候,会对文件进行锁定。若是这个用户点击连接,又访问一个该站session_start网页。这是,因为session_id同样,这个页面也有读取锁定该用户存放session文件。 因为,第一个页面没有执行完,它一直锁定了该文件。 第2个页面就不能获取锁,一直处于等待状态。web
这样一个看似小的问题,实际上,若是网站上面有大量用户访问,会致使session读取文件一直阻塞等待着。用户浏览器一直跟服务器保持链接,会消耗不少服务器资源。web服务器活跃链接数也会增大,可能很快就会耗费完链接资源,出现拒绝服务器。浏览器
用memcache保存用户session,相比读取文件有很大速度提高。并且能够作到多服务器共享session。确实很方便,这个时候,咱们发现不会出现用文件保存session锁定清理。memcached读取时候,是共享的,不会出现等待。可是,咱们会发现,memcached链接数,仍是会保持着。而且,链接数会增长,若是这个时候,你设置的memcached链接数太小,你会发现,很快memcached就挂死了。 这也是,作memcache接管session时候,常常遇到问题。 有时候,web服务器不少,session(memcache)不多。发现memcache莫名其妙死掉,可能跟这个有关系。太多反映很慢的页面(启动session),会致使占用了大量memcached链接数。服务器
其实,经过file或者session,若是处理耗时页面,都会带来服务器资源很大消耗。其实咱们通常写入session或者读取时候,若是本身可以控制。用完了,就关闭掉文件锁,或者mem链接。就会自动释放资源,其实,php里面的:session_write_close,session_commit 函数就能作到改功能。咱们看下下面代码执行过程:session
<?php ini_set('session.save_path','/tmp/'); function open($save_path, $session_name) { echo __FUNCTION__,"<br />"; return(true); } function close() { echo __FUNCTION__,"<br />"; return(true); } function read($id) { echo __FUNCTION__,"<br />"; } function write($id, $sess_data) { echo __FUNCTION__,"<br />"; return(true); } function destroy($id) { echo __FUNCTION__,"<br />"; return(true); } function gc($maxlifetime) { echo __FUNCTION__,"<br />"; return true; } session_set_save_handler("open", "close", "read", "write", "destroy", "gc"); register_shutdown_function('test'); function test() { echo __FUNCTION__,"<br />"; } session_start(); echo 'aaaaa',"<br />";
启动”session_start” 会自动执行,open,read函数,而后页面执行完,会执行shutdown函数,最后会把session写入进去,而后执行close关闭文件。从session_start 到页面结束,会一直锁定文件或者保持链接的。ide
咱们若是 执行完session_start后,执行”session_commit();” 看看结果memcached
执行过程:执行commit后,直接会调用,wirte,close操做。直接关闭文件或者关闭链接(memcache)了。 函数
第一次写入后,而后提交,再次打开写入,而后再次提交。咱们发现,2次数据都保存到用户session中了。性能
1.只读取session页面,建议打开后,就直接commit,这是$_SESSION变量已经生成了。优化
2.有对session进行写入页面,建议修改完$_SESSION后,直接调用commit
3.屡次打开而且写入,这个不建议使用,比较打开文件,写入都是耗费时间的。若是能一次搞定的,就不要作屡次了。 除非,中间执行很耗时的业务。
后记:其实,使用完session,随手commit也不是坏事,养成习惯后。能够节省性能,减小服务器开销。是个不错选择!