将PHP的session数据存储到数据库中的代码实例_php实例
一个开发环境有多个网站,需要使用不同的session,解决方案很多。不过这次也高大上一把,用数据库存,方便以后扩展。
PostgreSQL版
首先是数据库的部分
--drop table php_session create unlogged table php_session ( sess_id varchar(32) primary key, modify_time timestamp with time zone not null, sess_data varchar(3000) default '' ); create index concurrently idx_php_session_modify_time on php_session(modify_time); --set_session(id, data) create or replace function set_session(varchar, varchar) returns void as $set_session$ with upsert as ( update php_session set modify_time = current_timestamp, sess_data = $2 where sess_id = $1 returning 1 ) insert into php_session (sess_id, modify_time, sess_data) select $1, current_timestamp, $2 where not exists ( select 1 from upsert ); $set_session$ language sql; --get_session(id) create or replace function get_session(varchar) returns varchar as $get_session$ select sess_data from php_session where sess_id = $1 $get_session$ language sql; --del_session create or replace function del_session(varchar) returns void as $del_session$ delete from php_session where sess_id = $1 $del_session$ language sql; --gc_session create or replace function gc_session() returns void as $del_session$ delete from php_session where modify_time < current_timestamp - interval '30 days' $del_session$ language sql;
然后是PHP的部分
<?php session_set_save_handler( function ($savePath, $sessionName) {//open return true; }, function () {//close return true; }, function ($id) {//read $sql = "select get_session($1)"; $stmt = pg_query_params(SESSION_CONN, $sql, array($id)); $result = pg_fetch_row($stmt); return $result[0]; }, function ($id, $data) {//write $sql = "select set_session($1, $2)"; pg_query_params(SESSION_CONN, $sql, array($id, $data)); return true; }, function ($id) {//destroy $sql = "select del_session($1)"; pg_query_params(SESSION_CONN, $sql, array($id, $data)); return true; }, function ($maxlifetime) {//gc //php needn't control the global session gc return true; } ); register_shutdown_function('session_write_close'); ?>
然后只要在session_start之前调用这个就可以了
至于SESSION_CONN,那是我定义的一个常量,表示一个指向session数据库的链接而已。
MySQL版
再总结一个针对MySQL的集成更多基础功能的例子:
表结构:
CREATE TABLE IF NOT EXISTS `sessioninfo` ( `sid` varchar(255) NOT NULL, `value` text NOT NULL, `expiration` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`sid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
session信息存储到数据库的类:
class MySessionHandler implements SessionHandlerInterface { /** * @access private * @var object 数据库连接 */ private $_dbLink; /** * @access private * @var string 保存session的表名 */ Private $_sessionTable; /** * @access private * @var string session名 */ private $_sessionName; /** * @const 过期时间 */ const SESSION_EXPIRE = 10; public function __construct($dbLink, $sessionTable) { if(!is_object($dbLink)) { return false; } $this->_dbLink = $dbLink; $this->_sessionTable = $sessionTable; } /** * 打开 * @access public * @param string $session_save_path 保存session的路径 * @param string $session_name session名 * @return integer */ public function open($session_save_path, $session_name) { $this->_sessionName = $session_name; return 0; } /** * 关闭 * @access public * @return integer */ public function close() { return 0; } /** * 关闭session * @access public * @param string $session_id session ID * @return string */ public function read($session_id) { $query = "SELECT value FROM {$this->_sessionTable} WHERE sid = {$session_id} AND UNIX_TIMESTAMP(expiration) + " . self::SESSION_EXPIRE . " > UNIX_TIMESTAMP(NOW())"; $result = $this->_dbLink->query($query); if(!isset($value) || empty($value)) { $value = ""; return $value; } $this->_dbLink->query("UPDATE {$this->_sessionTable} SET expiration = CURRENT_TIMESTAMP() WHERE sid = {$session_id}"); $value = $result->fetch_array(); $result->free(); return $value['value']; } /** * 写入session * @access public * @param string $session_id session ID * @param string $session_data session data * @return integer */ public function write($session_id, $session_data) { $query = "SELECT value FROM {$this->_sessionTable} WHERE sid = '{$session_id}' AND UNIX_TIMESTAMP(expiration) + " . self::SESSION_EXPIRE . " > UNIX_TIMESTAMP(NOW())"; $result = $this->_dbLink->query($query); $result = $result->fetch_array(); if(!empty($result)) { $result = $this->_dbLink->query("UPDATE {$this->_sessionTable} SET value = {$session_data} WHERE sid = {$session_id}"); } else{ $result = $this->_dbLink->query("INSERT INTO {$this->_sessionTable} (sid, value) VALUES ('{$session_id}', '{$session_data}')"); } if($result){ return 0; } else{ return 1; } } /** * 销魂session * @access public * @param string $session_id session ID * @return integer */ public function destroy($session_id) { $result = $this->_dbLink->query("DELETE FROM {$this->_sessionTable} WHERE sid = '{$session_id}'"); if($result){ return 0; } else{ return 1; } } /** * 垃圾回收 * @access public * @param string $maxlifetime session 最长生存时间 * @return integer */ public function gc($maxlifetime) { $result = $this->_dbLink->query("DELETE FROM {$this->_sessionTable} WHERE UNIX_TIMESTAMP(expiration) < UNIX_TIMESTAMP(NOW()) - " . self::SESSION_EXPIRE); if($result){ return 0; } else{ return 1; } } }
$dbLink = new mysqli("localhost", "root", "root", "test"); $sessionTable = "sessioninfo"; $handler = new MySessionHandler($dbLink, $sessionTable); session_set_save_handler($handler); session_start(); $_SESSION['name'] = "test"; echo $_SESSION["name"]; //session_destroy();

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

在MySQL中,添加字段使用ALTERTABLEtable_nameADDCOLUMNnew_columnVARCHAR(255)AFTERexisting_column,刪除字段使用ALTERTABLEtable_nameDROPCOLUMNcolumn_to_drop。添加字段時,需指定位置以優化查詢性能和數據結構;刪除字段前需確認操作不可逆;使用在線DDL、備份數據、測試環境和低負載時間段修改表結構是性能優化和最佳實踐。

session_start()iscucialinphpformanagingusersessions.1)ItInitiateSanewsessionifnoneexists,2)resumesanexistingsessions,and3)setsasesessionCookieforContinuityActinuityAccontinuityAcconActInityAcconActInityAcconAccRequests,EnablingApplicationsApplicationsLikeUseAppericationLikeUseAthenticationalticationaltication and PersersonalizedContentent。

要安全、徹底地卸載MySQL並清理所有殘留文件,需遵循以下步驟:1.停止MySQL服務;2.卸載MySQL軟件包;3.清理配置文件和數據目錄;4.驗證卸載是否徹底。

MySQL批量插入数据的高效方法包括:1.使用INSERTINTO...VALUES语法,2.利用LOADDATAINFILE命令,3.使用事务处理,4.调整批量大小,5.禁用索引,6.使用INSERTIGNORE或INSERT...ONDUPLICATEKEYUPDATE,这些方法能显著提升数据库操作效率。

MySQL函數可用於數據處理和計算。 1.基本用法包括字符串處理、日期計算和數學運算。 2.高級用法涉及結合多個函數實現複雜操作。 3.性能優化需避免在WHERE子句中使用函數,並使用GROUPBY和臨時表。

在MySQL中配置字符集和排序規則的方法包括:1.設置服務器級別的字符集和排序規則:SETNAMES'utf8';SETCHARACTERSETutf8;SETCOLLATION_CONNECTION='utf8_general_ci';2.創建使用特定字符集和排序規則的數據庫:CREATEDATABASEexample_dbCHARACTERSETutf8COLLATEutf8_general_ci;3.創建表時指定字符集和排序規則:CREATETABLEexample_table(idINT

使用EXPLAIN命令可以分析MySQL查詢的執行計劃。 1.EXPLAIN命令顯示查詢的執行計劃,幫助找出性能瓶頸。 2.執行計劃包括id、select_type、table、type、possible_keys、key、key_len、ref、rows和Extra等字段。 3.根據執行計劃,可以通過添加索引、避免全表掃描、優化JOIN操作和使用覆蓋索引來優化查詢。

在macOS上安裝MySQL可以通過以下步驟實現:1.安裝Homebrew,使用命令/bin/bash-c"$(curl-fsSLhttps://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"。 2.更新Homebrew,使用brewupdate。 3.安裝MySQL,使用brewinstallmysql。 4.啟動MySQL服務,使用brewservicesstartmysql。安裝後,可通過mysql-u
