日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

php如何将mysql数据库中的admin字段赋值给session_转php中使用session_set_save_handler()函数把session保存到MySQL数据库实例...

發布時間:2025/3/12 数据库 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php如何将mysql数据库中的admin字段赋值给session_转php中使用session_set_save_handler()函数把session保存到MySQL数据库实例... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

PHP保存session默認的是采用的文件的方式來保存的,這僅僅在文件的空間開銷很小的windows上是可以采用的,但是如果我們采用 uinx或者是liux上的文件系統的時候,這樣的文件系統的文件空間開銷是很大的,然而session是要時時刻刻的使用的,大量的用戶就要創建很多的 session文件,這樣對整個的服務器帶來性能問題。

另一方面,如果服務器起采用群集的方式的話就不能保持session的一致性,所以我們就緒要采用數據庫的方式來保存session,這樣,不管有 幾臺服務器同時使用,只要把他們的session保存在一臺數據庫服務器上就可以保證session的完整了,具體如何來實現請繼續看下去。

PHP保存session默認的情況下是采用的文件方式來保存的,我們在PHP的配制文件PHP.ini中可以看到這樣的一行:

復制代碼 代碼如下:

session.save_handler="files"

這樣的意思就是采用文件來保存session 的,要采用數據庫來保存的話,我們需要修改成用戶模式,改成

復制代碼 代碼如下:

session.save_handler="use"

就可以了,但是,這僅僅是說明我門沒有采用文件的方式存儲session,我們還要選擇數據庫和建立數據庫的表。

建立數據庫和數據庫的表結構,我們可以采用PHP可以使用的任何的數據庫,因為PHP和mysql的結合最好,我就使用mysql來做示例,當然根據你的需要可以改稱別的數據庫。

創建數據庫

復制代碼 代碼如下:

create database 'session';

創建表結構

復制代碼 代碼如下:

create table 'session'( id char(32) not null , 'user 'char(30), data char(3000) ,primary key ('id') );

PHP保存session編寫PHP文件

復制代碼 代碼如下:

$con = mysql_connect("127.0.0.1", "user" , "pass");

mysql_select_db("session");

function open($save_path, $session_name) {

return(true);

}

function close() {

return(true);

}

function read($id) {

if ($result = mysql_query("select * from session where id='$id'")) {

if ($row = mysql_felth_row($result)) {

return $row["data"];

}

} else {

return "";

}

}

function write($id, $sess_data) {

if ($result = mysql_query("update session set data='$sess_data' where id='$id'")) {

return true;

} else {

return false;

}

}

function destroy($id) {

if ($result = mysql_query("delete * from session where id='$id'")) {

return true;

} else {

return false;

}

}

function gc($maxlifetime) {

return true;

}

session_set_save_handler("open", "close", "read", "write", "destroy", "gc");

session_start();

// proceed to use sessions normally

保存成為session_user_start.php。

現在我們的PHP保存session的工作就已經完成了,只要你在需要在使用session的時候,把session_user_start.php包含進來.注意,這個文件一定要在文件的第一行包含,然后就像使用文件的session一樣的方法使用就可以了。

以上僅僅是個簡單教程,在實際的應用中,可以對它封裝得更專業些,參考代碼如下:

SessionMysql.class.php

復制代碼 代碼如下:

/**

* SessionMysql 數據庫存儲類

*/

defined('IN_QIAN') or exit('Access Denied');

class SessionMysql {

public $lifetime = 1800; // 有效期,單位:秒(s),默認30分鐘

public $db;

public $table;

/**

* 構造函數

*/

public function __construct() {

$this->db = Base::loadModel('SessionModel');

$this->lifetime = Base::loadConfig('system', 'session_lifetime');

session_set_save_handler(

array(&$this, 'open'),??// 在運行session_start()時執行

array(&$this, 'close'),??// 在腳本執行完成 或 調用session_write_close() 或 session_destroy()時被執行,即在所有session操作完后被執行

array(&$this, 'read'),??// 在運行session_start()時執行,因為在session_start時,會去read當前session數據

array(&$this, 'write'),??// 此方法在腳本結束和使用session_write_close()強制提交SESSION數據時執行

array(&$this, 'destroy'),?// 在運行session_destroy()時執行

array(&$this, 'gc')???// 執行概率由session.gc_probability 和

session.gc_divisor的值決定,時機是在open,read之后,session_start會相繼執行open,read和gc

);

session_start(); // 這也是必須的,打開session,必須在session_set_save_handler后面執行

}

/**

* session_set_save_handler open方法

*

* @param $savePath

* @param $sessionName

* @return true

*/

public function open($savePath, $sessionName) {

return true;

}

/**

* session_set_save_handler close方法

*

* @return bool

*/

public function close() {

return $this->gc($this->lifetime);

}

/**

* 讀取session_id

*

* session_set_save_handler read方法

* @return string 讀取session_id

*/

public function read($sessionId) {

$condition = array(

'where' => array(

'session_id' => $sessionId

),

'fields' => 'data'

);

$row = $this->db->fetchFirst($condition);

return $row ? $row['data'] : '';

}

/**

* 寫入session_id 的值

*

* @param $sessionId 會話ID

* @param $data 值

* @return mixed query 執行結果

*/

public function write($sessionId, $data) {

$userId = isset($_SESSION['userId']) ? $_SESSION['userId'] : 0;

$roleId = isset($_SESSION['roleId']) ? $_SESSION['roleId'] : 0;

$grouId = isset($_SESSION['grouId']) ? $_SESSION['grouId'] : 0;

$m = defined('ROUTE_M') ? ROUTE_M : '';

$c = defined('ROUTE_C') ? ROUTE_C : '';

$a = defined('ROUTE_A') ? ROUTE_A : '';

if (strlen($data) > 255) {

$data = '';

}

$ip = get_ip();

$sessionData = array(

'session_id'?=> $sessionId,

'user_id'??=> $userId,

'ip'???=> $ip,

'last_visit'?=> SYS_TIME,

'role_id'??=> $roleId,

'group_id'??=> $grouId,

'm'????=> $m,

'c'????=> $c,

'a'????=> $a,

'data'???=> $data,

);

return $this->db->insert($sessionData, 1, 1);

}

/**

* 刪除指定的session_id

*

* @param string $sessionId 會話ID

* @return bool

*/

public function destroy($sessionId) {

return $this->db->delete(array('session_id' => $sessionId));

}

/**

* 刪除過期的 session

*

* @param $lifetime session有效期(單位:秒)

* @return bool

*/

public function gc($lifetime) {

$expireTime = SYS_TIME - $lifetime;

return $this->db->delete("`last_visit`

}

}

在系統文件的某個地方,實例化這個類即可!

復制代碼 代碼如下:

new SessionMysql();

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的php如何将mysql数据库中的admin字段赋值给session_转php中使用session_set_save_handler()函数把session保存到MySQL数据库实例...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。