本文目录导读:

在PHP项目中配置站点访问统计,通常有以下几种方式,根据你的技术栈和需求复杂度选择:
简单文件日志记录(入门级)
这是最基础的方式,通过PHP脚本记录每次访问:
<?php
// 写入访问日志
function logVisit() {
$logFile = __DIR__ . '/visits.log';
$ip = $_SERVER['REMOTE_ADDR'] ?? 'unknown';
$time = date('Y-m-d H:i:s');
$page = $_SERVER['REQUEST_URI'] ?? '/';
$userAgent = $_SERVER['HTTP_USER_AGENT'] ?? 'unknown';
$logEntry = "[$time] IP: $ip | Page: $page | UA: $userAgent\n";
file_put_contents($logFile, $logEntry, FILE_APPEND | LOCK_EX);
}
logVisit();
优点:简单直接,无需数据库 缺点:数据难以分析,性能差,不适合高流量站点
数据库存储(推荐中小项目)
使用MySQL记录访问数据:
CREATE TABLE site_visits (
id INT AUTO_INCREMENT PRIMARY KEY,
page_url VARCHAR(255),
visitor_ip VARCHAR(45),
visit_time DATETIME,
user_agent TEXT,
referer VARCHAR(255)
);
CREATE TABLE daily_stats (
date DATE,
page_url VARCHAR(255),
visit_count INT DEFAULT 0,
unique_visitors INT DEFAULT 0,
PRIMARY KEY (date, page_url)
);
PHP记录代码:
<?php
function recordVisit($pdo) {
$stmt = $pdo->prepare("INSERT INTO site_visits
(page_url, visitor_ip, visit_time, user_agent, referer)
VALUES (?, ?, NOW(), ?, ?)");
$stmt->execute([
$_SERVER['REQUEST_URI'],
$_SERVER['REMOTE_ADDR'],
$_SERVER['HTTP_USER_AGENT'] ?? '',
$_SERVER['HTTP_REFERER'] ?? ''
]);
// 更新日统计
$stmt = $pdo->prepare("INSERT INTO daily_stats
(date, page_url, visit_count, unique_visitors)
VALUES (CURDATE(), ?, 1, 1)
ON DUPLICATE KEY UPDATE
visit_count = visit_count + 1");
$stmt->execute([$_SERVER['REQUEST_URI']]);
}
// 在入口文件调用
include 'db_config.php';
recordVisit($pdo);
中间件/框架集成(推荐)
Laravel 示例
// app/Http/Middleware/VisitLogger.php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\DB;
class VisitLogger
{
public function handle($request, Closure $next)
{
$response = $next($request);
DB::table('site_visits')->insert([
'url' => $request->fullUrl(),
'ip' => $request->ip(),
'user_agent' => $request->userAgent(),
'created_at' => now()
]);
return $response;
}
}
ThinkPHP 示例
// 在全局中间件或控制器基类中
public function recordVisit()
{
$data = [
'url' => request()->url(),
'ip' => request()->ip(),
'visit_time' => time(),
'user_agent' => request()->header('User-Agent')
];
Db::name('site_visits')->insert($data);
}
使用第三方统计服务(推荐生产环境)
方案A:Google Analytics(GA4)
<!-- 在HTML头部引入 -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXX"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-XXXXXXXX');
</script>
方案B:百度统计
<script>
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?你的统计ID";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
</script>
方案C:自建Matomo(推荐隐私友好)
// 使用Matomo PHP Tracker
use PiwikTracker;
$tracker = new PiwikTracker($siteId, 'https://your-matomo-domain.com');
$tracker->setTokenAuth('your_token');
$tracker->doTrackPageView('Page Title');
高级功能实现(数据可视化)
获取统计数据的API示例:
<?php
// api/stats.php
function getPageStats($pdo, $startDate, $endDate) {
$stmt = $pdo->prepare("SELECT
page_url,
COUNT(*) as total_visits,
COUNT(DISTINCT visitor_ip) as unique_visitors,
DATE(visit_time) as date
FROM site_visits
WHERE visit_time BETWEEN ? AND ?
GROUP BY page_url, DATE(visit_time)
ORDER BY total_visits DESC");
$stmt->execute([$startDate, $endDate]);
return $stmt->fetchAll();
}
// 返回JSON
header('Content-Type: application/json');
echo json_encode(getPageStats($pdo, '2024-01-01', '2024-12-31'));
性能优化建议
异步写入(避免阻塞页面)
<?php
// 使用消息队列或异步任务
function asyncRecordVisit($data) {
// 方案1: 写入临时文件,由cron定期处理
$tmpFile = '/tmp/visit_'.date('Ymd').'.log';
file_put_contents($tmpFile, json_encode($data)."\n", FILE_APPEND);
// 方案2: 使用Redis队列
$redis->lPush('visit_queue', json_encode($data));
}
// 消费队列的worker进程
while ($data = $redis->rPop('visit_queue')) {
$visit = json_decode($data, true);
$pdo->insert($visit);
}
使用缓存减少数据库压力
<?php
function getCachedStats($cache, $pageUrl) {
$key = "stats:$pageUrl";
$stats = $cache->get($key);
if (!$stats) {
$stats = calculateStats($pageUrl);
$cache->set($key, $stats, 300); // 缓存5分钟
}
return $stats;
}
完整实践建议
- 中小项目:使用数据库记录 + 定时清除旧数据
- 企业项目:推荐Matomo或Google Analytics
- 高并发站点:使用Redis + 消息队列异步处理
- 隐私优先:自建统计系统(Matomo/Piwik)
- 简化方案:使用Nginx日志分析(ELK Stack)
选择哪种方式取决于你的项目规模、维护能力和需求复杂度,对于大多数PHP项目,推荐使用第三方服务或成熟的统计库,可以节省大量开发和维护成本。