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

PHP 系統流量分析儀表板:即時統計 IP、PV、訪客軌跡

     編輯:PHP 綜合知識

系統概覽

本程式以 MySQL 資料表 stream 記錄每位訪客的 IP、時間戳、瀏覽次數與 User-Agent 資訊,並提供一個按日期向前追溯的流量報表頁面,顯示:

  • 累積總 PV(Page Views)
  • 每日 PV、獨立訪客數(UV)
  • 每日訪客明細:IP、最近訪問時間、瀏覽次數、User-Agent
  • 分頁導航(以 $day 參數控制往前幾天)

資料表結構

CREATE TABLE stream (
    ip TEXT,          -- 訪客 IP
    sTime INT,        -- Unix timestamp
    visits INT,       -- 該筆記錄的瀏覽次數(通常為 1)
    info TEXT         -- User-Agent 等附加資訊
);

核心程式碼解析

1. 參數處理與資料庫連線

if ($day < 0) $day = 0;
$mlink = mysql_connect('localhost', 'ajax', 'xxxxxxx'); // 建議改用 mysqli/PDO

2. 總累積 PV

$query = "SELECT SUM(visits) AS tvisits FROM stream";
$result = mysql_db_query('ajax', $query, $mlink);
if ($row = mysql_fetch_object($result)) {
    echo "瀏覽首頁總累積次數: {$row->tvisits}";
}

3. 逐日統計迴圈

$week = array("星期日","星期一","星期二","星期三","星期四","星期五","星期六");
for ($i = 0; $i <= $day; $i++) {
    $ctime1 = time() - 24*3600*$i;       // 當天 00:00:00
    $ctime2 = time() - 24*3600*($i-1);   // 翌日 00:00:00

    // 修正:mktime 參數順序為 時、分、秒、月、日、年
    $stoday1 = mktime(0,0,0, date('m',$ctime1), date('d',$ctime1), date('Y',$ctime1));
    $stoday2 = mktime(0,0,0, date('m',$ctime2), date('d',$ctime2), date('Y',$ctime2));

    echo "<p>日期: " . date("m月d日", $ctime1) . $week[date('w',$ctime1)];

    // 當日 PV
    $query = "SELECT SUM(visits) AS tvisits FROM stream 
              WHERE sTime >= $stoday1 AND sTime < $stoday2";
    $result = mysql_db_query('ajax', $query, $mlink);
    if ($row = mysql_fetch_object($result)) echo " 瀏覽累積: {$row->tvisits}";

    // 當日 UV(獨立 IP 數)
    $query = "SELECT * FROM stream 
              WHERE sTime >= $stoday1 AND sTime < $stoday2 ORDER BY sTime DESC";
    $result = mysql_db_query('ajax', $query, $mlink);
    echo " 瀏覽總人數: " . mysql_num_rows($result);

    // 明細表格
    echo '<table border="0" width="100%" cellspacing="0" cellpadding="2">';
    echo '<tr><th>IP位址</th><th>最近時間</th><th>次數</th><th>用戶資訊</th></tr>';
    while ($row = mysql_fetch_object($result)) {
        echo "<tr><td>{$row->ip}</td>";
        echo "<td>" . date("h:i:sa", $row->sTime) . "</td>";
        echo "<td>{$row->visits}</td>";
        echo "<td>{$row->info}</td></tr>";
    }
    echo "</table><hr>";
}

關鍵技術點與潛在問題

項目現狀風險/改善
資料庫擴充性單表儲存所有明細流量大時極易膨脹,建議分表(按月/日)或改用 ClickHouse/InfluxDB
查詢效能全表掃描 + ORDER BY需在 sTime、ip 建立索引;UV 統計改用 COUNT(DISTINCT ip)
時間計算手動 mktime 組合易出錯(如月份 0 基底),建議用 DateTime 或 strtotime('midnight -'.$i.' days')
安全性直接拼接 SQL、硬編碼帳密必須改用 Prepared Statements、環境變數管理密鑰
IPv6 支援TEXT 可存但無索引優化改用 VARBINARY(16) 或 INET6_ATON()
隱私合規完整儲存 IP + UAGDPR/個資法需匿名化或縮短保存期限

現代化重構建議

  1. 資料收集端:改用 Nginx/Apache 存取日誌 + Filebeat/Fluentd 推送至 Elasticsearch 或 ClickHouse。
  2. 查詢端:Grafana / Kibana / Superset 直接連接時序資料庫繪製儀表板。
  3. 即時性:WebSocket 推送即時 UV/PV,而非輪詢重整。
  4. 地理分析:整合 MaxMind GeoIP2 庫,顯示國家/城市分佈熱力圖。
  5. 機器人過濾:引入 User-Agent 解析庫(如 UAParser)標記並排除爬蟲流量。

結語

這個腳本完整展示了「寫入輕量、讀取聚合」的經典流量統計模型。雖然技術棧屬於 PHP 4/5 早期風格,但其核心指標定義(PV、UV、時間切片、明細鑽取)至今仍是網站分析的基石。現代化重構時,應保留指標邏輯,替換底層儲存與查詢引擎以應對高併發與大數據量。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved