採用 MySQL 存儲訪客心跳記錄,結合 PHP 定期清理過期數據,即可輕鬆實現「當前在線人數」統計。本文提供完整建表語句、核心邏輯代碼與部署說明,可直接集成至項目。
CREATE TABLE useronline (
timestamp INT(15) DEFAULT '0' NOT NULL,
ip VARCHAR(40) NOT NULL,
file VARCHAR(100) NOT NULL,
PRIMARY KEY (timestamp),
KEY ip (ip),
KEY file (file)
);
timestamp:訪問時間戳(秒),主鍵保證唯一性。ip:訪客 IP,建立索引加速去重查詢。file:當前請求腳本路徑($_SERVER['PHP_SELF']),支援頁面級統計。$server = "localhost";
$db_user = "root";
$db_pass = "your_password"; // 強烈建議設置強密碼
$database = "users";
$timeoutseconds = 300; // 5 分鐘無刷新視為離線
$timestamp = time();
$timeout = $timestamp - $timeoutseconds;
<?php
// 1. 連接資料庫
$conn = mysql_connect($server, $db_user, $db_pass);
if (!$conn) die("DB Connect Failed");
// 2. 選擇庫
mysql_select_db($database, $conn);
// 3. 記錄本次訪問(INSERT IGNORE 避免主鍵衝突報錯)
$ip = $_SERVER['REMOTE_ADDR'];
$file = $_SERVER['PHP_SELF'];
$sql = "INSERT INTO useronline (timestamp, ip, file) VALUES ($timestamp, '$ip', '$file')";
mysql_query($sql, $conn);
// 4. 清理過期記錄
mysql_query("DELETE FROM useronline WHERE timestamp < $timeout", $conn);
// 5. 統計當前頁面唯一 IP 數
$result = mysql_query("SELECT DISTINCT ip FROM useronline WHERE file = '$file'", $conn);
$user = mysql_num_rows($result);
// 6. 輸出結果
mysql_close($conn);
echo ($user == 1) ? "1 user online\n" : "$user users online\n";
?>
timestamp,極高併發下可能衝突,生產環境建議改用 BIGINT AUTO_INCREMENT 主鍵 + UNIQUE KEY (ip, file)。mysqli/PDO + 預處理語句防注入,本文為教學示例保留舊 API。online.php。include 'online.php'; 或 AJAX 請求該接口。