本程式以 MySQL 資料表 stream 記錄每位訪客的 IP、時間戳、瀏覽次數與 User-Agent 資訊,並提供一個按日期向前追溯的流量報表頁面,顯示:
$day 參數控制往前幾天)CREATE TABLE stream (
ip TEXT, -- 訪客 IP
sTime INT, -- Unix timestamp
visits INT, -- 該筆記錄的瀏覽次數(通常為 1)
info TEXT -- User-Agent 等附加資訊
);
if ($day < 0) $day = 0;
$mlink = mysql_connect('localhost', 'ajax', 'xxxxxxx'); // 建議改用 mysqli/PDO
$query = "SELECT SUM(visits) AS tvisits FROM stream";
$result = mysql_db_query('ajax', $query, $mlink);
if ($row = mysql_fetch_object($result)) {
echo "瀏覽首頁總累積次數: {$row->tvisits}";
}
$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 + UA | GDPR/個資法需匿名化或縮短保存期限 |
這個腳本完整展示了「寫入輕量、讀取聚合」的經典流量統計模型。雖然技術棧屬於 PHP 4/5 早期風格,但其核心指標定義(PV、UV、時間切片、明細鑽取)至今仍是網站分析的基石。現代化重構時,應保留指標邏輯,替換底層儲存與查詢引擎以應對高併發與大數據量。