PHP中多服务器共享SESSION的方法


在PHP中SESSION默认是用文件来进行保存的,如session.save_path=/tmp,则是将session数据保存在/tmp目录下,如果并发用户量很大,在这个目录下就会存在大量类似sess_xxxxxx的session文件,导致性能下降,不少朋友可能都没有注意到php.ini里面Session设置部分中有这样一项:

  ; session.save_path = "N; MODE; /path"

  这项设置提供给我们可以给session存放目录进行多级散列,其中“N”表示要设置的目录级数,“MODE”表示目录的权限属性,默认为600,在WINDOWS上基本是不用设置的,*NIX上也可以不用设置,后面的“/path”表示session文件存放的根目录路径,比如我们设置为下面的格式

  session.save_path = "2; d:/php5/tmp"

  上面的设置表示我们把d:/php5/tmp目录作为php的session文件存放根目录,在该目录下进行两级目录散列,每一级目录分别是0-9和a-z共36个字母数字为目录名,这样存放session的目录可以达到36*36个,相信作为单台服务器来说,这是完全够用了,如果说您的系统架构设计为多台服务器共享session数据,可以把目录级增加到3级或者更多。

  需要注意的是,php自己并不会自动创建子目录,需要您自己动手去创建,网上找到这样的自动创建目录的代码,大家可以做个参考。下面的代码自动创建3级子目录,可以自己动手根据需要进行修改。

set_time_limit(0);
$string = '0123456789abcdefghijklmnopqrstuvwxyz';
$length = strlen($string);
function makeDir($param)
{
if(!file_exists($param)) {
makeDir(dirname($param));
mkdir($param);
}
}
for($i = 0; $i < $length; $i++) {
for($j = 0; $j < $length; $j++) {
for($k = 0; $k < $length; $k++) {
makeDir($string[$i].'/'.$string[$j].'/'.$string[$k]);
}
}
}
?>
多服务器共享session的方法:

  1.通过NFS文件共享的方式,多台WEB服务器共享保存session文件的磁盘

  2.保存在数据库中,这种方式的扩展性很强,可以随意增加WEB而不受影响

  3.可以将session数据保存在memcached中,memcached是基于内存存储数据的,性能很高,用户并发量很大的时候尤其合适,参考PHP实现多服务器session共享之memcache共享

  4.文件方式保存session时,可以采用php的扩展eaccelerator来存储sesion,参考

  eaccelerator 应用之“使用共享内存存储Session”

  首先创建表,用来保存session数据

CREATE TABLE `sessions` (              
      `sessionid` varchar(32) NOT NULL default '',    
      `data` mediumtext NOT NULL,            
      `lastvisit` int(10) unsigned NOT NULL default '0', 
      PRIMARY KEY (`sessionid`)             
     ) ENGINE=MyISAM DEFAULT CHARSET=gbk

  主要的代码如下:

  session_mysql.class.php

class session
{
var $lifetime = 1800;
  var $op = '';
  
  function __construct($op = '')
  {
    $this -> op = $op;
  session_set_save_handler(array(&$this,'open'), array(&$this,'close'), array(&$this,'read'), array(&$this,'write'), array(&$this,'destroy'), array(&$this,'gc'));
    $this->debug('session_id:' . PHP中多服务器共享SESSION的方法 - 站长学院

PHP中多服务器共享SESSION的方法

2008-12-25 14:49:00查看学习心得
{GetProperty(Content)}
« 
» 

Copyright © 2016 phpStudy | 豫ICP备2021030365号-3