关于php中session的一些用法小结

php相关 / 2012年12月26日 22时50分 / 10121人浏览
PHP服务端默认的session存储是文件存放方式,在Windows上PHP默认的Session服务端文件存放在C:\WINDOWS\Temp下,*NIX下默认存放在/tmp下,如果说并发访问很大或者session建立太多,在这两个目录下就会存在大量类似sess_xxxxxx的session文件,同一个目录下文件数过多会导致性能下降,并且可能导致受到攻击最终出现文件系统错误。针对这样的情况,PHP本身体提供了比较好的解决办法。 不少朋友可能都没有注意到php.ini里面Session设置部分中有这样一项: ; session.save_path = "N; MODE; /path" 这项设置提供给我们可以给session存放目录进行多级散列,其中“N”表示要设置的目录级数,“MODE”表示目录的权限属性,默认为600,在WINDOWS上基本是不用设置的,*NIX上也可以不用设置,后面的“/path”表示session文件存放的根目录路径,比如我们设置为下面的格式 session.save_path = "2; /tmp/phpsession" 上面的设置表示我们把/tmp/phpsession目录作为php的session文件存放根目录,在该目录下进行两级目录散列,每一级目录分别是0-9和a-z共36个字母数字为目录名,这样存放session的目录可以达到36*36个,相信作为单台服务器来说,这是完全够用了,如果说您的系统架构设计为多台服务器共享session数据,可以把目录级增加到3级或者更多。 需要注意的是,php自己并不会自动创建子目录,需要您自己动手去创建,以下自动创建目录的代码,大家可以做个参考。下面的代码自动创建3级子目录,可以自己动手根据需要进行修改。
下面提供两种更好的解决方案: 1.session入库 利用session_set_save_handler函数 作用:自定义SESSION 存储机制。 可用于修改session存储介质,如进行session入库等操作。 实例代码
class sessionsTable extends db{
    protected $table_name = 'sessions';
    public function __construct(){
        parent::__construct();
        session_set_save_handler(
        array($this,'sess_open'),
        array($this,'sess_close'),
        array($this,'sess_read'),
        array($this,'sess_write'),
        array($this,'sess_destroy'),
        array($this,'sess_gc')
        );
        session_start();
    }
    public function sess_open($save_path,$session_name){
        return true;
          
    }
    public function sess_close(){
        return true;
    }
      
      
    public function sess_read($sess_id){
        $sql = "select * from {$this->getTable()} where sess_id='{$sess_id}'";
        $row = $this->getRow($sql);
        return $row['sess_data'];
    }
    public function sess_write($sess_id,$sess_data){
  
        $expire = time();
        $sql = "insert into {$this->getTable()} values('{$sess_id}','{$sess_data}','{$expire}') on duplicate key
        update sess_data='{$sess_data}',expire='{$expire}'";
        return $this->query($sql);
    }
      
    public function sess_destroy($sess_id){
  
        $sql = "delete from {$this->getTable()} where sess_id='{$sess_id}'";
  
        return $this->query($sql);
          
    }
    public function sess_gc($life_time){
        $expire = time() - $life_time;
        $sql = "delete from {$this->getTable()} where expire < {$expire} ";
        return $this->query($sql);
    }
  
      
  
}
2.用memcache来存储session 方法I: 在 php.ini 中全局设置 session.save_handler = memcache session.save_path = "tcp://127.0.0.1:11211" 方法II:在某个一个应用中利用ini_set设置 ini_set("session.save_handler", "memcache"); ini_set("session.save_path", "tcp://127.0.0.1:11211"); 使用多个 memcached server 时用逗号","隔开,并且和 Memcache::addServer() 文档中说明的一样,可以带额外的参数"persistent"、"weight"、"timeout"、"retry_interval" 等等,类似这样的:"tcp://host1:port1?persistent=1&weight=2,tcp://host2:port2" 。