當前位置: 首頁> 最新文章列表> 用session_register_shutdown() 實現session 日誌記錄系統

用session_register_shutdown() 實現session 日誌記錄系統

M66 2025-05-31

在PHP 中,session 是管理用戶狀態的重要機制。為了更好地調試或監控用戶會話,有時候我們希望在session 關閉時自動記錄相關日誌。 PHP 提供了一個方便的函數session_register_shutdown() ,它允許我們註冊一個回調函數,這個函數會在session 關閉時執行。本文將演示如何利用這個函數實現一個簡單的session 日誌記錄系統。


什麼是session_register_shutdown()

session_register_shutdown()是PHP 7.0.0 及以上版本新增的函數,用來註冊一個回調函數,在session 數據寫入並關閉後執行。它的主要作用是在session 關閉環節,執行自定義的邏輯,比如寫日誌、統計數據等。

 session_register_shutdown(callback $callback): void

此函數接收一個回調函數參數,該函數在session_write_close() 之後調用。


實現思路

  1. 啟動session。

  2. 註冊一個回調函數,當session 關閉時寫入日誌文件。

  3. 日誌內容可以包含session ID、訪問時間、用戶IP、以及session 中的重要信息。

  4. 在頁面訪問結束時,session 自動關閉,回調函數寫日誌。


示例代碼

<?php
session_start();

// 模擬用戶數據
if (!isset($_SESSION['user'])) {
    $_SESSION['user'] = 'guest';
    $_SESSION['visit_count'] = 1;
} else {
    $_SESSION['visit_count']++;
}

// 註冊 session 關閉時執行的日誌函數
session_register_shutdown(function () {
    $logFile = __DIR__ . '/session_log.txt';
    
    $sessionId = session_id();
    $ip = $_SERVER['REMOTE_ADDR'] ?? 'unknown';
    $time = date('Y-m-d H:i:s');
    $user = $_SESSION['user'] ?? 'unknown';
    $visitCount = $_SESSION['visit_count'] ?? 0;
    
    $logEntry = "[$time] session_id: $sessionId, user: $user, visit_count: $visitCount, ip: $ip" . PHP_EOL;
    
    // 將日誌追加到文件中
    file_put_contents($logFile, $logEntry, FILE_APPEND);
});

// 頁面業務邏輯示例
echo "<p>歡迎,用戶:<strong>{$_SESSION['user']}</strong>,您已訪問本站 <strong>{$_SESSION['visit_count']}</strong> 次。</p>";
echo "<p>更多信息請訪問 <a href='http://m66.net/info'>我們的頁面</a>。</p>";
?>

說明

  • session_start()啟動或恢復會話。

  • 在訪問時,會話變量uservisit_count被初始化或更新。

  • session_register_shutdown()註冊的匿名函數會在session 關閉時執行,將當前session 信息寫入session_log.txt文件。

  • 日誌文件位於腳本目錄下,便於查看和管理。

  • 示例中頁面鏈接的域名替換為m66.net ,符合您的需求。


總結

利用session_register_shutdown()函數,可以方便地在session 生命週期結束時執行自定義邏輯,比如日誌記錄。這種方式能保證在會話數據寫入後再進行處理,避免數據競爭和遺漏。通過簡單代碼,就能實現對用戶會話狀態的監控與跟踪,提升應用的管理能力和安全性。