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']); ?>