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

PHP Session 完整操作指南:從入門到進階

     編輯:PHP 綜合知識

Session 核心機制

Session 在伺服器端儲存用戶資料,透過 **Session ID**(預設 PHPSESSID)在客戶端(Cookie)與伺服器關聯。同一瀏覽器、同一站點僅有一個 Session ID。

基本操作

啟動 Session

<?php
session_start(); // 必須在任何輸出前呼叫
?>

寫入/讀取資料(PHP 4.2+ 推薦)

<?php
session_start();
$_SESSION['username'] = 'nostop';
$_SESSION['age'] = 23;

echo $_SESSION['username']; // nostop
echo $_SESSION['age'];      // 23
?>

舊版 session_register()(已棄用/移除)

<?php
session_start();
$Name = '範例';
session_register('Name'); // 註冊變數名,非字串 '$Name'
// 等同 $_SESSION['Name'] = $Name;
?>

刪除特定變數

<?php
session_start();
unset($_SESSION['username']); // 刪除單一鍵
// 或
session_unregister('username'); // 舊版
?>

銷毀整個 Session

<?php
session_start();
session_unset();    // 釋放所有 $_SESSION 變數
session_destroy();  // 刪除伺服器端 Session 檔案與 Cookie
?>

進階設定

檢查變數是否已註冊

<?php
session_start();
if (!isset($_SESSION['gender'])) { // 建議用 isset()
    $_SESSION['gender'] = 'female';
}
?>

取得/設定 Session 名稱

<?php
$name = session_name();       // 取得預設 'PHPSESSID'
session_name('MYAPP_SESS');   // 設定新名稱(需在 session_start() 前)
?>

取得/設定 Session ID

<?php
$id = session_id();           // 取得目前 ID
session_id('custom_id_123');  // 設定指定 ID(需在 session_start() 前)
?>

設定 Session 生存期

方法一:手動 setcookie(相容性最佳)

<?php
session_start();
$lifeTime = 24 * 3600; // 1 天
setcookie(session_name(), session_id(), time() + $lifeTime, '/');
?>

方法二:session_set_cookie_params(需在 session_start() 前)

<?php
$lifeTime = 24 * 3600;
session_set_cookie_params($lifeTime, '/', '.example.com', true, true); // path, domain, secure, httponly
session_start();
$_SESSION['admin'] = true;
?>

注意: IE 6 對 session_set_cookie_params 有 Bug,建議統一用 setcookie 手動控制。

自定 Session 儲存路徑

<?php
$savePath = __DIR__ . '/session_data';
if (!is_dir($savePath)) mkdir($savePath, 0755, true);
session_save_path($savePath); // 必須在 session_start() 前
session_start();
?>

常見錯誤與解決

1. "headers already sent"

原因: session_start() 前有輸出(空白、HTML、echo、BOM)。

解決: 確保 session_start() 在檔案最開頭,或開啟 ob_start() 緩衝輸出。

2. "open(/tmp/sess_xxx) failed"

原因: 預設儲存路徑 /tmp 不存在或無寫入權限(Windows 環境常見)。

解決:

  1. 建立資料夾:C:\tmp
  2. 修改 php.ini:session.save_path = "C:/tmp"
  3. 或程式中呼叫 session_save_path()。

安全最佳實踐

  • HTTPS 環境:設定 session.cookie_secure = 1、session.cookie_httponly = 1。
  • 防固定攻擊:登入後呼叫 session_regenerate_id(true) 重新生成 ID。
  • 嚴格域控制:session.cookie_domain = '.example.com' 限制子域共享。
  • 資料敏感度:Session 僅存識別資訊(UID、權限),敏感資料加密或存資料庫。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved