首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP Session 儲存方式詳解:檔案、資料庫與自定義

     編輯:PHP 綜合知識

三大預設儲存方式

  • files(預設):以檔案形式儲存於 session.save_path,高併發下 I/O 瓶頸明顯。
  • memory (mm/shm):共享記憶體,速度快但重啟遺失,適合單機低併發。
  • user(自定義):透過 session_set_save_handler() 實作介面,支援資料庫、Redis、Memcached 等。

自定義 MySQL Session 實作完整範例

1. 資料表結構

CREATE TABLE `mysession` (
  `session_key` CHAR(32) NOT NULL,
  `session_data` TEXT,
  `session_expiry` INT(11),
  PRIMARY KEY (`session_key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2. 實作六大介面函數

<?php
function mysession_open($save_path, $session_name) {
    $link = mysqli_connect('localhost', 'root', 'root', 'php');
    return $link ? true : false;
}

function mysession_close() { return true; }

function mysession_read($key) {
    $link = mysqli_connect('localhost', 'root', 'root', 'php');
    $key = mysqli_real_escape_string($link, $key);
    $sql = "SELECT session_data FROM mysession WHERE session_key='$key' AND session_expiry > " . time();
    $res = mysqli_query($link, $sql);
    $row = mysqli_fetch_assoc($res);
    return $row ? $row['session_data'] : '';
}

function mysession_write($key, $data) {
    $link = mysqli_connect('localhost', 'root', 'root', 'php');
    $key = mysqli_real_escape_string($link, $key);
    $data = mysqli_real_escape_string($link, $data);
    $expiry = time() + 1200;
    $sql = "REPLACE INTO mysession (session_key, session_data, session_expiry) VALUES ('$key', '$data', $expiry)";
    return mysqli_query($link, $sql);
}

function mysession_destroy($key) {
    $link = mysqli_connect('localhost', 'root', 'root', 'php');
    $key = mysqli_real_escape_string($link, $key);
    return mysqli_query($link, "DELETE FROM mysession WHERE session_key='$key'");
}

function mysession_gc($maxlifetime) {
    $link = mysqli_connect('localhost', 'root', 'root', 'php');
    $expiry = time();
    return mysqli_query($link, "DELETE FROM mysession WHERE session_expiry < $expiry");
}

session_set_save_handler(
    'mysession_open', 'mysession_close', 'mysession_read',
    'mysession_write', 'mysession_destroy', 'mysession_gc'
);
session_start();
// 之後正常使用 $_SESSION
?>

3. 關鍵注意事項

  • 生產環境請使用 PDO + Prepared Statements 防止 SQL 注入。
  • 連線建議用靜態變數或單例複用,避免每次開關連線。
  • session.gc_maxlifetime 需與資料庫清理邏輯一致。
  • 高併發場景建議改用 Redis / Memcached(見下文)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved