<?php
// ini_set('session.save_handler', 'user'); // 注意 set_session_save_handler() 一定要在 session_start()前执行
// session.gc_probability =1 //session 回收机制的概率分子
// session.gc_divisor = 1000 // session 回收机制的概率分母
// session.gc_maxlifetime = 1440 // session 有效期
// 当开启 session 时,如 session_start(),
// 执行顺序为 sess_open() -> sess_read()->sess_write() -> sess_close() ->sess_destroy() -> sess_gc() ini_set("session.save_handler", "user"); // 自定义保存方式 function sess_open($sess_path, $sess_name)
{
echo "session 路径:" . $sess_path . "<br />";
echo "session名称:" . $sess_name . "<br />";
return true;
} function sess_close()
{
echo "session 关闭<br />";
return true;
} function sess_read($sess_id)
{
echo "读取session id :" . $sess_id . "<br />";
return true;
} function sess_write($sess_id, $data)
{
echo "写入数据 session id " . $sess_id . "<br />";
echo "session 数据 " . $data . "<br />";
return true;
} function sess_destroy($sess_id)
{
echo "销毁 session id " . $sess_id . "<br />";
return true;
} function sess_gc($sess_maxlifetime)
{
echo "session 回时机制,每隔时间为 " . $sess_maxlifetime;
return true;
} session_set_save_handler("sess_open", "sess_close", "sess_read", "sess_write", "sess_destroy", "sess_gc");
session_start();
$_SESSION['lin'] = 'lin3615';
echo 'hi, world ';
$_SESSION['long'] = 'good luck for you';
// 开启 cookie 时,默认时会以 session 名称 PHPSESSID 为了cookie 为记录
// 如 $_COOKIE['PHPSESSID'] = session_id; 值即为session_id值。 // 默认时,它们之间的关系是:session_name() = PHPSESSID ; $_COOKIE[session_name()] = session_id();
print_r($_COOKIE); ?> ================ 以下适合 <?php
/*
数据表
CREATE TABLE IF NOT EXISTS `sessions` (
`id` char(200) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
`data` text COLLATE utf8_unicode_ci,
`timestamp` varchar(200) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
*/
class Session
{ /**
* a database connection resource
* @var resource     $maxTime 生存时间
*/
private $_sess_db;
private $maxTime; /**
* Open the session
* @return bool
*/
public function open() {
$this->maxTime = get_cfg_var("session.gc_maxlifetime") > 0 ? get_cfg_var("session.gc_maxlifetime") : 3600;
if ($this->_sess_db = mysql_connect('localhost',
'root',
'123456')) {
return mysql_select_db('test', $this->_sess_db);
}
return false; } /**
* Close the session
* @return bool
*/
public function close() { return mysql_close($this->_sess_db); } /**
* Read the session
* @param int session id
* @return string string of the sessoin
*/
public function read($id) { $id = mysql_real_escape_string($id);
$sql = "SELECT `data` FROM `sessions` " .
"WHERE id = '" . $id . "'"; if ($result = mysql_query($sql, $this->_sess_db)) {
if (mysql_num_rows($result)) {
$record = mysql_fetch_assoc($result);
return $record['data'];
}
}
return ''; } /**
* Write the session
* @param int session id
* @param string data of the session
*/
/*
replace [into] 与 insert 功能类似,不同点在于:replace into 首先尝试插入数据表中,如果发现表中已经有此行数据(根据主键或者唯一索引判定)则先删除此行,然后插入新的数据。否则直接插入数据。要注意是:插入数据的表必须有主键或者唯一索引。否则就成了 insert 了
*/
public function write($id, $data) { $sql = sprintf("REPLACE INTO `sessions` VALUES('%s', '%s', '%s')",
mysql_real_escape_string($id),
mysql_real_escape_string($data),
mysql_real_escape_string(time() + $this->maxTime));
return mysql_query($sql, $this->_sess_db); } /**
* Destoroy the session
* @param int session id
* @return bool
*/
public function destroy($id) { $sql = sprintf("DELETE FROM `sessions` WHERE `id` = '%s'", $id);
return mysql_query($sql, $this->_sess_db); } /**
* Garbage Collector
* @param int life time (sec.)
* @return bool
* @see session.gc_divisor 100
* @see session.gc_maxlifetime 1440
* @see session.gc_probability 1
* @usage execution rate 1/100
* (session.gc_probability/session.gc_divisor)
*/
public function gc($max) { $sql = sprintf("DELETE FROM `sessions` WHERE `timestamp` < '%s'",
mysql_real_escape_string(time() - $max));
return mysql_query($sql, $this->_sess_db); } } //ini_set('session.gc_probability', 50); ini_set('session.save_handler', 'user'); $session = new Session();
session_set_save_handler(array($session, 'open'),
array($session, 'close'),
array($session, 'read'),
array($session, 'write'),
array($session, 'destroy'),
array($session, 'gc')); // below sample main session_start();
//session_regenerate_id(true); if (isset($_SESSION['counter'])) {
$_SESSION['counter']++;
} else {
$_SESSION['counter'] = 1; } print_r($_SESSION);
//unset($_SESSION);
//session_destroy();
?>
<?php
// 以下这官网手册整合
/**
数据表
CREATE TABLE `ws_sessions` (
`session_id` char(100) NOT NULL default '',
`session_expires` int(11) unsigned NOT NULL default '0',
`session_data` text,
PRIMARY KEY (`session_id`)
) engine=InnoDB;
*/
class MySessionHandler implements SessionHandlerInterface
{
// 生存时间
public $lifeTime;
// 连接句柄
public $dbHandle;
function open($savePath, $sessName) {
// 获取生存时间
$this->lifeTime = get_cfg_var("session.gc_maxlifetime"); // $dbHandle = new mysqli("主机名", "用户名", "密码", "数据库名");
$dbHandle = new mysqli("localhost", "root", "", "test"); if($dbHandle->connect_error)
return false;
$this->dbHandle = $dbHandle;
return true;
}
function close() {
$this->gc(ini_get('session.gc_maxlifetime'));
// 关闭连接
return $this->dbHandle->close();
}
function read($sessID) {
// fetch session-data
$res = $this->dbHandle->query("SELECT session_data AS d FROM ws_sessions
WHERE session_id = '$sessID'
AND session_expires > ".time()); if($dd = $res->fetch_assoc())
{
return $dd['d'];
}
return "";
}
function write($sessID,$sessData) {
// 新的有效时间
$newExp = time() + $this->lifeTime; $res = $this->dbHandle->query("SELECT * FROM ws_sessions
WHERE session_id = '$sessID'");
// 有效
if($res->num_rows) {
// 更新
$this->dbHandle->query("UPDATE ws_sessions
SET session_expires = '$newExp',
session_data = '$sessData'
WHERE session_id = '$sessID'");
// 更新是否生效
if($this->dbHandle->affected_rows)
return true;
}
else {
$this->dbHandle->query("INSERT INTO ws_sessions (
session_id,
session_expires,
session_data)
VALUES(
'" . $sessID ."',
" . $newExp .",
'" . $sessData ."')");
// 更新是否生效
if($this->dbHandle->affected_rows)
return true;
}
// 发生错误
return false;
}
function destroy($sessID) {
// delete session-data
$this->dbHandle->query("DELETE FROM ws_sessions WHERE session_id = '$sessID'");
// if session was deleted, return true,
if($this->dbHandle->affected_rows)
return true;
// ...else return false
return false;
}
function gc($sessMaxLifeTime) {
// delete old sessions
$this->dbHandle->query("DELETE FROM ws_sessions WHERE session_expires < ".time());
// return affected rows
return $this->dbHandle->affected_rows;
}
} ini_set('session.save_handler', 'user');
$handler = new MySessionHandler();
session_set_save_handler($handler, true); // 引用方法,以为另存文件,如:session.php,新建立文件,如test.php
include('session.php');
session_start();
$_SESSION['lin3615'] = date('Y-m-d H:i:s', time());
print_r($_SESSION);

  

php session 自定义的设置测试的更多相关文章

  1. PHP session有效期session.gc_maxlifetime的设置方法

    PHP(外文名: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言.语法吸收了C语言.Java和Perl的特点,入门门槛较低,易于学习,使用广泛,主要适 ...

  2. c# webConfig中的session超时详细设置

    webConfig中的session超时详细设置 我们在webConfig中设置Session超时的时候,如果最后发行的地址是远程服务器,我们很多不是必须的属性并不用设置,如果设之后,倒不能让 ses ...

  3. 用c#开发微信(5)自定义菜单设置工具 (在线创建)

    读目录 1 使用 2 原理 3. 错误 上次写了<用c#开发微信 (4) 基于Senparc.Weixin框架的接收事件推送处理 (源码下载)>,有园友问到如何创建菜单的问题,今天就介绍下 ...

  4. session超时时间设置方法

    session超时时间设置方法 由于session值之前没有设置,以至于刚登录的网站,不到一分钟就超时了,总结了一下,原来是session过期的原因,以下是设置session时间的3个方法: 1. 在 ...

  5. asp.net项目发布网上-当前自定义错误设置禁止远程查看应用程序

    早上服务器的系统突然出错了,悲剧~ ==============异常信息:============================== 服务器上出现应用程序错误.此应用程序的当前自定义错误设置禁止远程 ...

  6. unigui session超时时间设置

    unigui session超时时间设置 默认的SESSION超时时间是10分钟. 网络 SOCKET 程序,像 数据库,中间件,UNIGUI等...为了防止过多的僵死连接卡死服务端,服务端都会主动踢 ...

  7. handler 方法进不去,服务器上出现应用程序错误。此应用程序的当前自定义错误设置禁止远程查看

    HTTP/1.1 500 Internal Server ErrorCache-Control: privateContent-Type: text/html; charset=utf-8Server ...

  8. php session自定义处理

    原文:http://www.cnblogs.com/mrcoke/  这个人的博客上转的. 这个博客也好: 学算法和数据结构!!http://blog.csdn.net/21aspnet/articl ...

  9. 【VS开发】在VS2010中开发ActiveX控件设置测试容器的方式

    在VS2010中开发ActiveX控件设置测试容器的方式 借鉴文章http://blog.csdn.net/waxgourd0/article/details/7374669 在VS2010中开发MF ...

随机推荐

  1. 如何实例化i2c_client(四法)

    一.在板文件进行client的实例化 在内核的初始化中(例如在板文件中)定义设备的信息.这种操作的前提是内核编译的时候已经确定有哪些i2c设备和它们的地址,还要知道连接的总线的编号. 比如在板文件/a ...

  2. 软件授权协议有什么作用,例如GPL、Apache License、CDDL、EPL这些协议有什么区别?

    1.授权协议有什么作用:授权协议就是授予你使用或修改软件等权利,由于软件受到著作权保护,未经授权使用即是侵犯著作权,属于违法行为,所以同意或签署软件授权协议是你使用或修改软件的前提条件.既然是授权协议 ...

  3. TCP/UDP是如何传输的?

    一.网络模型: OSI参考模型 TCP/IP参考模型 二.网络通讯要素 IP地址: 网络中设备的标识 不易记忆,可用主机名 本机回环地址:127.0.0.1 主机名: localhost 端口号: 用 ...

  4. 导入一个AndroidStudio工程作为一个Library Module

    尊重劳动成果,转载请注明出处:http://blog.csdn.net/growth58/article/details/47441245 关注新浪微博:@于卫国 邮箱:yuweiguocn@gmai ...

  5. KDB调试内核

    http://www.ibm.com/developerworks/cn/linux/l-kdbug/

  6. Intra-cluster Replication in Apache Kafka--reference

    Kafka is a distributed publish-subscribe messaging system. It was originally developed at LinkedIn a ...

  7. expect批量分发公钥

    sshkey.exp #!/usr/bin/expect# 由于是多台服务器,需要在shell脚本中循环调用该脚本 if { $argc != 2 } { send_user "usage: ...

  8. hdu2002

    import java.util.*;class Main{public static void main(String args[]){Scanner cin=new Scanner(System. ...

  9. eclipse快速查找一个变量、方法或者类被引用的地方

    最近不停debug,拿到一个变量之后总是要先概览一下才好下手,之前一直用Ctrl+F来做,太麻烦.今天查了下eclipse使用,发现有快捷键,使用方法: 先双击要查看的变量.方法或者类,使之被选中,然 ...

  10. JQuery字符串替换replace方法

    在日常的js开发中,常常会用到JQuery, 当要把字符串中的内容替换时,如果使用类似C#的string.replace方法,如下 var str='aabbccaa'; str=str.replac ...