PHP-php 数据库session存储

PHP-php 数据库session存储

甜柠檬 发布于 2017-03-02 字数 155 浏览 999 回复 2

php session用数据库存储。怎么回收已过时的数据呢,如果定时清除的话应该怎么写定时?

gc是有比率的啊,如果设置100%回收的服务器压力是不是会很大啊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

偏爱自由 2017-07-20 2 楼

用数据库来 存储session是不科学的 你用memcache或者redis才存储

只需要修改php.ini里的如下代码

session.save_handler = memcache
session.save_path = "tcp://127.0.0.1:30000;tcp://127.0.0.1:40000;tcp://127.0.0.1:50000;"

根据你自己配置 你愿意用几个端口就用几个端口

浮生未歇 2017-05-27 1 楼

不需要通过定时清除数据库,PHP本身就提供了这样的功能。session_set_save_handler()方法里有一个"gc"参数就是专门用于Session垃圾回收的功能。多看看手册

//以下代码来自PHP手册,使用MySQL做为Session的示例。

<?php
class Session
{

/**
* a database connection resource
* @var resource
*/
private $_sess_db;

/**
* Open the session
* @return bool
*/
public function open() {

if ($this->_sess_db = mysql_connect(SESSION_DB_HOST,
SESSION_DB_USER,
SESSION_DB_PASS)) {
return mysql_select_db(SESSION_DB_DATABASE, $this->_sess_db);
}
return false;

}

/**
* Close the session
* @return bool
*/
public function close() {

return mysql_close($this->_sess_db);

}

/**
* 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 = sprintf("SELECT `data` FROM `sessions` " .
"WHERE id = '%s'", $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
*/
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()));
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;
}

?>