cookie原理
session用法
session默认保存在系统临时目录下,windows/temp下
可以通过修改session.save_path设置
php没有自动创建目录能力(特别是安全模式下不能创建目录、文件)
session使用注意事项:1.可以再php.ini文件设置auto_start自动开启即可使用session时不用session_start
2.session_start之前有输出,可用@注释掉提示或修改php.ini里output_buffering=4092
销毁session四种方法
\
session_destroy();//销毁文件,$_SESSION数组仍在
$_SESSION=array();//$_SESSION数组赋值为空,session文件仍存在
unset($_SESSION);//销毁session不成功,unset只能销毁session某个值(session数组只能为键值)
一次session操作两次读取session文件,$_SESSION存取是在内存,session文件则是在服务器硬盘,所以在同一脚本可能不一致,再下一脚本又归于一致
session文件的垃圾回收机制由php.ini的session.gc_probability=1个session.gc_divisor=1000决定,默认为1/1000
session入库的实现
<?php
//定义六个函数
/**
* 在session开启时执行,
* 负责完成session存储所需要资源的初始化工作!
*/
function sess_open() {
echo 'open<br>';
//连接数据库
$link = mysql_connect('127.0.0.1:3306', 'root', '123456');
mysql_query('set names utf8');
mysql_query('use itcast');
}
/**
* session_start()时,开启session时被执行
*
* 负责从当的session记录中,将session数据读取出来
*
* @param $sess_id string 当前的sessionID
*
* @return string session的数据,不需要序列化。如果没有读到则返回空字符串!
*/
function sess_read($sess_id) {
echo 'read<br>';
//利用 select 查询
$sql = "select sess_data from `session` where sess_id='$sess_id'";
$result = mysql_query($sql);
if($row = mysql_fetch_assoc($result)) {
return $row['sess_data'];
} else {
return '';
}
}
/**
* 在 脚本结束时被执行
*
* 负责,将当前的session数据,同步写到当前的session记录中
*
* @param $sess_id string
* @param $sess_data string
*
* @return bool
*/
function sess_write($sess_id, $sess_data) {
echo 'write<br>';
//执行写数据的操作!
//当前session记录存在则更新sess_data,不存在则插入!
$expire = time();
$sql = "insert into `session` values ('$sess_id', '$sess_data', $expire) on duplicate key update sess_data='$sess_data', expire=$expire";
return mysql_query($sql);
}
/**
* 在调用了 session_destroy()系统函数时,被自动调用!\
* 负责的功能时,利用当前id,删除当前的session记录!
*
* @param $sess_id string
*
* @return bool
*/
function sess_destroy($sess_id) {
echo 'destroy<br>';
//执行 delete 操作
$sql = "delete from `session` where sess_id='$sess_id'";
return mysql_query($sql);
}
/**
* 在session_start() 是执行
* 负责 删除所有的垃圾数据
*
* @param $maxlife int 最大的生命周期
*
* @return bool
*/
function sess_gc($ttl) {
echo 'gc<br>';
//
$now = time();
$last = $now-$ttl;//
$sql = "delete from `session` where expire < $last";
return mysql_query($sql);
}
/**
* 脚本结束
*/
function sess_close() {
echo 'close<br>';
// mysql_close();
return true;
}
session_set_save_handler(
'sess_open',
'sess_close',
'sess_read',
'sess_write',
'sess_destroy',
'sess_gc'
);
持久化session
<?php
//session_set_cookie_params(3600, '/', '100.com');
session_start();
//setcookie('PHPSESSID', session_id(), time()+3600);
$_SESSION['name'] = 'php';
var_dump($_SESSION);
header('Location: 106.php?PHPSESSID='.session_id());//禁用cookie
//先设置session.use_only_cookie=0 和 session.use_trans_sid=1
?>
<a href="106.php"> 106.php</a>
同时session.ga_maxtime与cookie设置session_id时间同步
cookie与session比较