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']);
?>
php about session store db or cache的更多相关文章
- DB,Cache和Redis应用场景分析
最近做一产品,微博方面的.数据存储同时用到了DB(mysql),Cache(memcache),Redis.其实最开始架构设计的时候是准备用MongoDB的,由于学习成本太高,最终选择放弃了,采用了比 ...
- Asp.net 服务器Application,Session,Cookie,ViewState和Cache区别
2.8 Context 的使用Context 对象包含与当前页面相关的信息,提供对整个上下文的访问,包括请求.响应.以及上文中的Session 和Application 等信息.可以使用此对象在网页之 ...
- Application,Session,Cookie,ViewState和Cache区别
在ASP.NET中,有很多种保存信息的内置对象,如:Application,Session,Cookie,ViewState和Cache等.下面分别介绍它们的用法和区别. 方法 信息量大小 作用域和保 ...
- Session Store
Session Store Configuration Session Usage Flash Data Session Drivers Configuration Since HTTP driven ...
- 在Apache Tomcat 7设置redis作为session store
在Apache Tomcat 7设置redis作为session store //输出tomcat控制台日志 root@ubuntu:~# cd /usr/tomcat/apache-tomcat- ...
- Session、Application、Cache
[Asp.Net]状态管理(Session.Application.Cache) 上篇博文介绍了在客户端状态管理的两种方式:http://www.cnblogs.com/wolf-sun/p/3329 ...
- Asp.net 中ViewState,cookie,session,application,cache的比较
Asp.net 中的状态管理维护包含ViewState,cookie,session,application,cache五种方式,以下是它们的一些比较: 1.存在于客户端还是服务端 客户端: view ...
- MongoDB实践-自定义ASP.NET Session Store
Session由来 由于HTTP协议是无状态的,客户端与服务器端进行“请求-响应”操作后,建立的连接就释放了,服务器端根本不知道刚才是哪个客户端访问的.但是有些场景是需要知道客户端的状态的,最典型的就 ...
- No Spring Session store is configured: set the 'spring.session.store-type'
发现session store type使用来存放session的存储方式,目前Spring boot中只支持Redis方式. 由于本应用暂无需将session放入redis的需求,故这里就可以将se ...
随机推荐
- div上下滚动
<div class="table-scrollable" style='height:601px'></div> <style> .table ...
- C++ 类中的const关键字
//类中的const关键字 #include<iostream> using namespace std; class Point{ public: //这个const关键字本质上修饰的是 ...
- socket udp广播和多播的简单实现
UDP广播与多播 作者:legend QQ:1327706646 使用UDP协议进行信息的传输之前不需要建议连接.换句话说就是客户端向服务器发送信息,客户端只需要给出服务器的ip地址和端口号,然后将信 ...
- 学习:erlang读取文件中的terms
参考:http://diaocow.iteye.com/blog/1766128 1. file:consult(Filename) -> {ok, Terms} | {error, Reaso ...
- javascript实现打印功能
<input name="b_print" type="button" class="ipt" onClick="print ...
- bootstrap基础学习五篇
bootstrap表格 Bootstrap 提供了一个清晰的创建表格的布局.下表列出了 Bootstrap 支持的一些表格元素: 标签 描述 <table> 为表格添加基础样式. < ...
- Object和Function谁先被创建
http://bbs.csdn.net/topics/390772104#post-397284029
- 高级service之ipc ADIL用法
感谢 如果你还没有看过前面一篇文章,建议先去阅读一下 Android Service完全解析,关于服务你所需知道的一切(上) ,因为本篇文章中涉及到的代码是在上篇文章的基础上进行修改的. 在上篇文章中 ...
- Java知识点梳理——集合
1.定义:Java集合类存放于java.util包,是存放对象的容器,长度可变,只能存放对象,可以存放不同的数据类型: 2.常用集合接口: a.Collection接口:最基本的集合接口,存储不唯一, ...
- Oracle数据库列出所有表名SQL语句
select table_name from user_tables