PHP项目如何配置站点访问统计?

wen PHP项目 53

本文目录导读:

PHP项目如何配置站点访问统计?

  1. 简单文件日志记录(入门级)
  2. 数据库存储(推荐中小项目)
  3. 中间件/框架集成(推荐)
  4. 使用第三方统计服务(推荐生产环境)
  5. 高级功能实现(数据可视化)
  6. 性能优化建议
  7. 完整实践建议

在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;
}

完整实践建议

  1. 中小项目:使用数据库记录 + 定时清除旧数据
  2. 企业项目:推荐Matomo或Google Analytics
  3. 高并发站点:使用Redis + 消息队列异步处理
  4. 隐私优先:自建统计系统(Matomo/Piwik)
  5. 简化方案:使用Nginx日志分析(ELK Stack)

选择哪种方式取决于你的项目规模、维护能力和需求复杂度,对于大多数PHP项目,推荐使用第三方服务或成熟的统计库,可以节省大量开发和维护成本。

抱歉,评论功能暂时关闭!