当前位置:首页 > 软件开发学习 > PHP学习 > 正文内容

php的session优化

admin7年前 (2014-03-19)PHP学习1062

这个问题很多做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 函数就能做到改功能。我们看下下面代码执行过程:

<?phpini_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 到页面结束,会一直锁定文件或者保持连接的。

我们如果 执行完session_start后,执行”session_commit();” 看看结果

 

执行过程: 执行commit后,直接会调用,wirte,close操作。直接关闭文件或者关闭连接(memcache)了。

  • 我们的问题

1.我们页面有多次写入,怎么样操作?

第一次写入后,然后提交,再次打开写入,然后再次提交。我们发现,2次数据都保存到用户session中了。

  • 我们来总结下吧

1.只读取session页面,建议打开后,就直接commit,这是$_SESSION变量已经生成了。

2.有对session进行写入页面,建议修改完$_SESSION后,直接调用commit

3.多次打开并且写入,这个不建议使用,比较打开文件,写入都是耗费时间的。如果能一次搞定的,就不要做多次了。 除非,中间执行很耗时的业务。

后记:其实,使用完session,随手commit也不是坏事,养成习惯后。可以节省性能,减少服务器开销。是个不错选择!欢迎大家交流!


扫描二维码推送至手机访问。

版权声明:本文由学无止境-开拓创新-ipvb学习网发布,如需转载请注明出处。

分享给朋友:

相关文章

php过滤危险html代码

用PHP过滤html里可能被利用来引入外部危险内容的代码。有些时候,需要让用户提交html内容,以便丰富用户发布的信息,当然,有些可能造成显示页面布局混乱的代码也在过滤范围内。以下是引用片段:#用户发...

PHP header() 函数

  PHP header() 函数  PHP HTTP 函数  定义和用法  header() 函数向客户端发送原始的 HTTP 报头。  认识到一点很重要,即必须在任何实际的输出被发送之前调用 he...

php的header来定义一个php页面为utf编码或GBK编码

  php的header来定义一个php页面为utf编码或GBK编码  php页面为utf编码  header("Content-type: text/html; charset=utf-8...

计算并输出1000000次字符串比较和数字比较的耗时

//9.代码:计算并输出1000000次字符串比较和数字比较的耗时。 $str1="123"; $str2="145"; $a=microtime(tru...

PHP语言的优势?

 随着移动互联网的兴起,互联网行业正向更加智能化的Web3.0时代迈进,中国互联网 行业进入了高速发展的势态,PHP语言已经为大部分企业广泛应用和重视(如:新浪、百度、腾讯、TOM、淘宝、搜...

PHP5的异常处理

/** * ■㈠PHP5的异常处理 * * PHP 5 添加了类似于其它语言的异常处理模块。在 PHP 代码中所产生的异常可被&nbs...