本文目录导读:

在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项目,推荐使用第三方服务或成熟的统计库,可以节省大量开发和维护成本。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播