php session 自定义的设置测试
<?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 自定义的设置测试的更多相关文章
- PHP session有效期session.gc_maxlifetime的设置方法
PHP(外文名: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言.语法吸收了C语言.Java和Perl的特点,入门门槛较低,易于学习,使用广泛,主要适 ...
- c# webConfig中的session超时详细设置
webConfig中的session超时详细设置 我们在webConfig中设置Session超时的时候,如果最后发行的地址是远程服务器,我们很多不是必须的属性并不用设置,如果设之后,倒不能让 ses ...
- 用c#开发微信(5)自定义菜单设置工具 (在线创建)
读目录 1 使用 2 原理 3. 错误 上次写了<用c#开发微信 (4) 基于Senparc.Weixin框架的接收事件推送处理 (源码下载)>,有园友问到如何创建菜单的问题,今天就介绍下 ...
- session超时时间设置方法
session超时时间设置方法 由于session值之前没有设置,以至于刚登录的网站,不到一分钟就超时了,总结了一下,原来是session过期的原因,以下是设置session时间的3个方法: 1. 在 ...
- asp.net项目发布网上-当前自定义错误设置禁止远程查看应用程序
早上服务器的系统突然出错了,悲剧~ ==============异常信息:============================== 服务器上出现应用程序错误.此应用程序的当前自定义错误设置禁止远程 ...
- unigui session超时时间设置
unigui session超时时间设置 默认的SESSION超时时间是10分钟. 网络 SOCKET 程序,像 数据库,中间件,UNIGUI等...为了防止过多的僵死连接卡死服务端,服务端都会主动踢 ...
- handler 方法进不去,服务器上出现应用程序错误。此应用程序的当前自定义错误设置禁止远程查看
HTTP/1.1 500 Internal Server ErrorCache-Control: privateContent-Type: text/html; charset=utf-8Server ...
- php session自定义处理
原文:http://www.cnblogs.com/mrcoke/ 这个人的博客上转的. 这个博客也好: 学算法和数据结构!!http://blog.csdn.net/21aspnet/articl ...
- 【VS开发】在VS2010中开发ActiveX控件设置测试容器的方式
在VS2010中开发ActiveX控件设置测试容器的方式 借鉴文章http://blog.csdn.net/waxgourd0/article/details/7374669 在VS2010中开发MF ...
随机推荐
- Java学习感受
一个暑假,两本书,让我了解到了Java的神奇美妙,这个工具的年龄跟我一样大,然而日久弥新,随着电脑技术科学家,工程师的开发,Java的功能越来越完善.学习的时间不长,但我比较着学习,把Java跟C.C ...
- linux文件权限详解
一.文件和目录权限概述在linux中的每一个文件或目录都包含有访问权限,这些访问权限决定了谁能访问和如何访问这些文件和目录. 通过设定权限可以从以下三种访问方式限制访问权限:只允许用户自己访问:允许一 ...
- Android应用开发学习之列表视图
作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz 列表视图我们会经常用到,可以通过两种方式来创建列表视图,一种方式是直接使用ListView组件创建,另一种方式是通过 ...
- ABAP ALV DEMO示例源码
关于ALV表格颜色,感觉这种需求在项目中用到的时候不是很多,但是前一段时间面试的时候,面试官问了我关于ALV单元格颜色的问题. 以前了解过一点,回答的不是很好,后来百度了一下,大概了解了一些,今天工作 ...
- Making the Elephant Dance: Strategic Enterprise Analysis
http://www.modernanalyst.com/Resources/Articles/tabid/115/ID/2934/categoryId/23/Making-the-Elephant- ...
- URAL 1146 Maximum Sum(最大子矩阵的和 DP)
Maximum Sum 大意:给你一个n*n的矩阵,求最大的子矩阵的和是多少. 思路:最開始我想的是预处理矩阵,遍历子矩阵的端点,发现复杂度是O(n^4).就不知道该怎么办了.问了一下,是压缩矩阵,转 ...
- HTML5到底能给企业带来些什么?
一.改变企业网络广告的模式与分布 广告是企业网络营销的主要方式之一.十几年来,无论是展示还是互动,基本被Adobe Flash所主宰.然而,HTML5网页的多媒体特性.三维.图形及特效,超炫的浏览体验 ...
- Show Global Status 整理
原文来源:MySQL 5.5 Reference Manual 部分翻译取自:<MySQL_5.1中文参考手册> 转载请注明原文链接http://www.cnblogs.com/lenag ...
- mac 神奇时光机
http://bbs.zol.com.cn/nbbbs/d544_8216.html
- Nginx高并发配置思路(轻松应对1万并发量)
测试机器为腾讯云服务器1核1G内存,swap分区2G,停用除SSH外的所有服务,仅保留nginx,优化思路主要包括两个层面:系统层面+nginx层面. 一.系统层面 1.调整同时打开文件数量 ulim ...