默认的session.save_handler = files,当大量用户访问需要session的页面时,默认会在/tmp/下生成和用户数同样数量的session文件,默认每1000次访问扫描一次session临时目录进行回收。并发高的话,可能导致unix/linux下文件节点数耗尽,而且磁盘压力会很大。这时候,我们可以考虑使用memcached和eaccelerator来代替files。
- 使用memcached,可以解决多主机轮询问题,速度快;缺点是需要在程序中加载相关的session handler重载程序。
- 使用eaccelerator,可以在程序没有任何侵入的前提下平滑过渡;缺点是和原来的files一样,不能跨机器使用。
至于到底要怎么用,还是要看实际情况了。
下边,我们主要说一下eaccelerator的session替换。
eaccelerator的功能除了对php预编译代码进行优化、缓存之外,还提供了php开发下的共享内存操作、session内存存储、内容缓存等功能。
php默认的session存储方式是在磁盘,虽然可以配置php生成的文件目录到内存盘中,但最终还是需要依赖于文件系统,势必产生文件操纵的开销。当网站并发请求很高的时候,还会产生另为一个性能问题:session目录下的文件数目过多,达到操纵系统瓶颈,虽然这时也可以通过配置为多级目录,但依旧无法摆脱文件系统的魔爪。
session.save_path = "N;/path"
eaccelerator专门针对PHP的这个Session存储效率问题,通过使用共享内存技术为我们提供了高效的解决方案。注意,要启用对session支持,再编译安装eaccelerator时需要启用-with-eaccelerator-sessions选项,例如:
./configure --enable-eaccelerator=shared --with-eaccelerator-shared-memory --with-eaccelerator-sessions --with-eaccelerator-content-caching
然后我们便可以在php.ini中修改配置来启用它:
session.save_handler = eaccelerator
最后重启apache,并执行如下测试:session.php
/**
* new session hander test.
* by lowell from www.zhongguowen.com
*/
if (! function_exists ( "eaccelerator_set_session_handlers" ) )
{
die ( "eaccelerator is in trouble!" );
}
switch ( $_GET [ "act" ] )
{
case "logout":
session_unset ( );
session_destroy ( );
header ( "Location: " . $_SERVER [ "PHP_SELF" ] );
break;
case "login":
$_SESSION["user"] = "Lowell Zhong";
header("Location: " . $_SERVER["PHP_SELF"]);
break;
}
if(isset($_SESSION["user"]) && $_SESSION["user"] != "")
{
echo "Welcome <strong>" . $_SESSION["user"] . "</strong> [<a href=/"?act=logout/">logout</a>]/n";
}else{
echo "<a href=/"?act=login/">Click me</a> for logining";
}
?>
这里再推荐另外还一个php session的共享内存存储模块:http://www.ossp.org/pkg/lib/mm/
参考:http://blog.csdn.net/guoguo1980/archive/2008/07/16/2659764.aspx