php about session store db or cache

PHP关于Session的配置:

在php.ini中配置为:session.name = PHPSESSID
在请求开始的时候,会话名称会被重置并存储到session.name配置项。
所以要想在不改变php.ini配置文件的情况下,更改session_name 必须要在 session_start()或
session_register()之前设置session_name。
PHP代码:
<?php
session_name('PHPSESSID_NEW');
session_start();
echo session_name();    //输出为PHPSESSID_NEW
?>

 

session.save_path = ‘/leapsoulcn’;
注意事项:
1、一般为了保证服务器的安全,session.save_path值最好设置为外网无法访问的目录,另外如果你是在linux服务器下进行session配置,请务必同时配置此目录为可读写权限,否则在执行session操作时会报错。
2、在使用session变量时,为了保证服务器的安全性,最好将register_globals设置为off,以保证全局变量不混淆,在使用session_register()注册session变量时,你可以通过系统全局变量$_SESSION来访问,比如你注册了leapsoulcn变量,你可以通过$_SESSION['leapsoulcn']来访问此变量。
session.save_handler = ”files”
默认以文件方式存取session数据,如果想要使用自定义的处理器来存取session数据,比如数据库,用”user”。
session.use_cookies = 1
是否使用cookies在客户端保存会话sessionid,默认为采用cookies
session.use_only_cookies = 0
是否仅仅使用cookie在客户端保存会话sessionid,这个选项可以使管理员禁止用户通过URL来传递id,默认为0,如果禁用的话,客户端如果禁用Cookie将使session无法工作。
session.name = “PHPSESSID”
当做cookie name来使用的session标识名
session.auto_start = 0
是否自动启动session,默认不启动,我们知道在使用session功能时,我们基本上在每个php脚本头部都会通过session_start()函数来启动session,如果你启动这个选项,则在每个脚本头部都会自动启动session,不需要每个脚本头部都以session_start()函数启动session,推荐关闭这个选项,采用默认值。
session.cookie_lifetime = 0
传递sessionid的Cookie有效期(秒),0表示仅在浏览器打开期间有效。
session.gc_probability = 1
session.gc_divisor = 100
定义在每次初始化会话时,启动垃圾回收程序的概率。计算公式如下:session.gc_probability/session.gc_divisor,比如1/100,表示有1%的概率启动启动垃圾回收程序,对会话页面访问越频繁,概率就应当越小。建议值为1/1000~5000。
session.gc_maxlifetime = 1440
设定保存的session文件生存期,超过此参数设定秒数后,保存的数据将被视为’垃圾’并由垃圾回收程序清理。判断标准是最后访问数据的时间(对于FAT文件系统是最后刷新数据的时间)。如果多个脚本共享同一个session.save_path目录但session.gc_maxlifetime不同,将以所有session.gc_maxlifetime指令中的最小值为准。

如果你在session.save_path选项中设定使用子目录来存储session数据文件,垃圾回收程序不会自动启动,你必须使用自己编写的shell脚本、cron项或者其他办法来执行垃圾搜集。

比如设置”session.gc_maxlifetime=1440″ (24分钟):
cd /path/to/sessions; find -cmin +24 | xargs rm

  

Session存储mysql数据库:

sql代码:

CREATE TABLE sessions(
    id CHAR(32) NOT NULL,
    data TEXT,
    last_accessed TIMESTAMP NOT NULL,
    PRIMARY KEY(id)
);

php代码:

名称:session_mysql.class.php

class session_mysql {
    private $sdbc = null;  //数据库连接句柄
    public function __construct() {
        $this->sdbc = mysqli_connect('127.0.0.1', 'root', '', 'test');     //数据库
        session_set_save_handler(array(&$this,'open_session'), array(&$this,'close_session'), array(&$this,'read_session'), array(&$this,'write_session'), array(&$this,'destroy_session'), array(&$this,'clean_session'));
        ini_set("session.cookie_httponly", 1);
        session_start();
    }
    //启动会话
    function open_session()
    {
        return true;
    }

    //关闭会话
    function close_session()
    {
        return mysqli_close($this->sdbc);
    }

    //读取会话数据
    function read_session($sid)
    {
        $sql = sprintf("SELECT data FROM sessions WHERE id='%s'", mysqli_real_escape_string($this->sdbc, $sid));
        $res = mysqli_query($this->sdbc, $sql);
        if (mysqli_num_rows($res) == 1) {
            list($data) = mysqli_fetch_array($res, MYSQLI_NUM);
            return $data;
        } else {
            return '';
        }
    }

    //写入会话数据
    function write_session($sid, $data)
    {
        $sql = sprintf("INSERT INTO sessions(id,data,last_accessed) VALUES('%s','%s','%s')", mysqli_real_escape_string($this->sdbc, $sid), mysqli_real_escape_string($this->sdbc, $data), date("Y-m-d H:i:s", time()));
        $res = mysqli_query($this->sdbc, $sql);
        if (!$res) {
            return false;
        }
        return true;
    }

    //销毁会话数据
    function destroy_session($sid)
    {
        $sql = sprintf("DELETE FROM sessions WHERE id='%s'", mysqli_real_escape_string($this->sdbc, $sid));
        $res = mysqli_query($this->sdbc, $sql);
        $_SESSION = array();
        if (!mysqli_affected_rows($this->sdbc) == 0) {
            return false;
        }
        return true;
    }

    //执行垃圾回收(删除旧的会话数据)
    function clean_session($expire)
    {
        $sql = sprintf("DELETE FROM sessions WHERE DATE_ADD(last_accessed,INTERVAL %d SECOND)<NOW()", (int)$expire);
        $res = mysqli_query($this->sdbc, $sql);
        if (!$res) {
            return false;
        }
        return true;
    }
}

测试:

创建一个 set_session.php

<?php
include 'session_mysql.class.php';
new session_mysql();
$_SESSION['id']=9;
$_SESSION['name']='mracale';
echo 'success';

创建一个 get_session.php

<?php
include 'session_mysql.class.php';
new session_mysql();
var_dump($_SESSION);

测试步骤:先访问  set_session.php文件  然后看数据库中的数据是否存储了,然后访问 get_session.php查看数据

 

session存储到redis方式:

<?php
ini_set("session.save_handler", "redis");
ini_set("session.save_path", "tcp://192.168.138.161:6379");
session_start();
$_SESSION['class'] = array('name' => 'mraclae', 'num' => 8);
//连接redis
$redis = new redis();
$redis->connect('192.168.138.161', 6379);
$redis->auth('456852'); //密码验证
//检查session_id
echo 'session_id:' . session_id() . '<br/>';
//redis存入的session(redis用session_id作为key,以string的形式存储)
echo 'redis_session:' . $redis->get('PHPREDIS_SESSION:' . session_id()) . '<br/>';
//php获取session值
var_dump($_SESSION['class']);
?>

  

posted @ 2018-07-17 15:16  zhuzhipeng  阅读(256)  评论(0编辑  收藏  举报