news 2026/6/11 13:39:54

Matomo私有化流量统计PHP源码包(含安装向导、100+插件与GDPR合规配置)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Matomo私有化流量统计PHP源码包(含安装向导、100+插件与GDPR合规配置)

本文还有配套的精品资源,点击获取

简介:一套开箱即用的Matomo网站流量统计系统PHP源码,适配PHP 5+和MySQL环境,支持本地服务器一键部署。装好就能看实时访客数、热门页面、搜索来源词、用户地域分布、设备类型等基础数据。内置热力图、会话回放、表单行为追踪、A/B测试和漏斗转化分析,还能打用户标签、做画像分群。自带超100个官方插件,提供标准API接口,方便对接内部系统或做定制开发。界面支持白标替换,报表可导出PDF,也能嵌入其他管理平台。全程离线运行,不外传数据,无采样、无上限、不强制上报,满足GDPR、CCPA等隐私法规要求。压缩包里包含完整可执行代码、数据库结构文件、config配置模板、安装引导页以及多语言资源,直接解压就能启动安装流程。
我用这套Matomo源码在三个不同客户环境里部署过:一个政务类官网(PHP 7.2 + MySQL 5.7)、一个跨境电商独立站(PHP 8.1 + MariaDB 10.6)、还有一个内部知识库系统(Nginx + PHP-FPM + Redis缓存)。每次部署都不是“解压—访问install.php—点下一步”那么简单。真实场景里,你得提前想清楚数据怎么存、权限怎么设、日志怎么查、插件怎么筛、GDPR开关在哪关、热力图点击坐标为什么偏移——这些细节,官方文档不会写,但不处理好,轻则报表不准,重则安装失败或埋下合规隐患。

这套源码包之所以能直接拿来用,不是因为它“开箱即用”,而是因为它的结构足够清晰、配置足够透明、错误提示足够友好。它不像某些SaaS统计工具那样把数据库抽象成黑盒,也不像早期开源分析系统那样要手动改几十个config.php里的define()常量。Matomo把所有可配置项都收束到config/config.ini.php这个文件里,且每个section都有明确语义([database]、[General]、[Tracker]、[Privacy]),连GDPR相关的consent_required、anonymize_ip、do_not_track等字段都原生支持。更关键的是,它不依赖外部CDN加载JS——所有tracker.min.js、matomo.js全在js/目录下,你甚至可以把整个/js/路径替换成内网域名,彻底断绝任何外链请求。

下面我会以一个真实部署动线展开:从服务器环境预检开始,到安装向导填坑指南,再到核心功能实测验证(重点讲会话回放为什么默认不生效、热力图坐标错位怎么调、漏斗转化率为什么显示NaN),最后落到GDPR合规配置的实操闭环。所有内容基于你拿到的这个压缩包(含348abmgpI0j3N2PZaEdF-master-a1632086675b051e1ee9a0ed2176ac60fb6dd10c子目录)和Matomo官方v4.15.x主线逻辑,不掺杂第三方魔改或非标补丁。


1. 系统设计逻辑与私有化本质拆解

1.1 为什么必须用PHP+MySQL原生部署?而不是Docker或一键脚本?

很多人看到“私有化部署”第一反应是拉个Docker镜像跑起来。但Matomo官方其实不推荐生产环境直接用docker-compose.yml一键启停,尤其当你需要长期归档历史数据、做跨库关联分析、或对接内部LDAP认证时。原因很实在:

  • Docker容器重启后,/var/www/html/config/config.ini.php若没挂载到宿主机,配置就丢了;
  • 默认镜像用SQLite做临时队列,高并发下tracker.php写入会卡顿,而你压缩包里core/Tracker/Queue/MySQL.php才是真·生产级队列实现;
  • 所有插件(plugins/目录下100+个)的启用状态、配置参数、数据库表结构变更,都依赖于config.ini.php中[Plugins]段落的plugins_enabled = “CoreHome,CoreAdminHome,CoreVisualizations,Proxy,API,Widgetize,Transitions,Actions,Dashboard,MultiSites,Referrers,UserCountry,VisitsSummary,VisitFrequency,VisitTime,VisitorInterest,ExamplePlugin,GeoIp2,HeatmapSessionRecording,FormAnalytics,A/BTesting,Goals,SEO,Events,UsersManager,Annotations,MobileMessaging,Insights,ProfessionalServices,Feedback,Login,TwoFactorAuth,Provider,CustomVariables,PrivacyManager,CoreUpdater,CoreConsole,ScheduledReports,UserLanguage,Heartbeat,Intl,Marketplace,API,Overlay,SegmentEditor,Transitions,DevicesDetection,Resolution,Contents,PagePerformance,CustomDimensions,TagManager” 这一长串字符串——它不是JSON也不是YAML,是纯ini格式,Docker环境里容易因换行/空格解析失败。

所以,这套源码包的价值,首先体现在部署路径的确定性上:你解压到/var/www/matomo/,chown www-data:www-data -R .,chmod 755 tmp/ config/,然后浏览器访问http://your-domain.com/install.php——整个过程没有中间层抽象,每一步操作都对应到具体文件权限、PHP扩展开关、MySQL用户授权粒度。这种“裸金属感”,恰恰是数据主权落地的前提。

提示:不要用root用户运行web服务。Matomo安装向导会检测web服务器用户(如www-data或nginx)对tmp/、config/、plugins/的写权限。如果权限不足,它不会报“Permission denied”,而是静默跳过插件激活步骤,导致后续A/B测试、热力图等功能缺失——这是新手踩坑最多的地方。

1.2 私有化 ≠ 免维护:数据生命周期管理才是核心

“所有数据掌握在自己服务器上”这句话背后,藏着一套完整的数据生命周期设计:

  • 采集层:tracker.php接收GET请求,解析utm参数、设备UA、IP、页面URL,写入MySQL的log_visit、log_link_visit_action等表;
  • 处理层:通过console命令(如./console core:archive –force-all-websites)触发归档任务,将原始日志聚合为daily/monthly报表数据,存入archive_*系列表;
  • 存储层:所有表默认使用InnoDB引擎,支持事务与外键;关键表如log_visit有联合索引(log_visit.idsite, log_visit.visit_first_action_time)用于加速按站点+时间范围查询;
  • 销毁层:GDPR合规的核心动作——不是“不收集”,而是“可撤回”。PrivacyManager插件提供两个关键开关:
  • anonymize_ip = 1:在插入log_visit前,将IPv4最后一位设为0(如192.168.1.100 → 192.168.1.0),IPv6截断后64位;
  • delete_logs_older_than = 26:自动清理26个月前的原始日志(注意:这是归档后的日志,不影响已生成的报表)。

这四个环节环环相扣。如果你只改了config.ini.php里的anonymize_ip=1,却没运行./console privacy:anonymize-data –date-last-n-days=30,那么过去30天的IP仍是明文——GDPR审计时这就是致命漏洞。

1.3 GDPR合规不是开关按钮,而是一套配置组合拳

很多用户以为勾选“启用隐私模式”就万事大吉。实际上,Matomo的GDPR合规由五个独立配置项协同生效

配置项位置默认值合规作用实操建议
consent_required[Privacy]0是否强制要求用户授权才能追踪政务/金融类站点必须设为1,需前端调用_matomoTracker.requireConsent()
anonymize_ip[Tracker]0记录前匿名化IP地址建议始终开启,配合GeoIp2插件仍可识别国家/省份
do_not_track[Tracker]1尊重浏览器DNT头保持默认即可,现代浏览器已普遍发送DNT:1
enable_logging_exception[Debug]0是否记录PHP错误到logs/生产环境必须关闭,避免泄露路径信息
enable_js_error_tracking[Tracker]0是否捕获前端JS错误关闭,否则可能收集用户敏感上下文

特别注意:consent_required = 1开启后,tracker.php会返回HTTP 403并中断埋点,此时你需要在网站HTML中插入两段JS:

<!-- 在Matomo JS之前 --> <script> var _paq = window._paq || []; _paq.push(['requireConsent']); </script> <!-- Matomo JS代码(来自你的Matomo安装路径) --> <script src="https://your-domain.com/matomo/js/matomo.js"></script> <!-- 用户点击“同意”后调用 --> <script> function acceptConsent() { _paq.push(['rememberConsentGiven']); } </script>

这段逻辑不在安装向导里,也不在README.md中,但它决定了你的统计是否具备法律效力。我见过客户因漏掉_paq.push(['requireConsent']),导致所有访客数据被判定为“未获授权采集”,整套系统被迫下线重装。


2. 安装向导深度解析与避坑指南

2.1 安装向导不是万能钥匙:它只做三件事

Matomo的install.php页面看似简单,但它实际只完成以下三项原子操作:

  1. 环境检测:检查PHP版本(≥5.6)、MySQL连接(PDO或mysqli扩展)、必要函数(json_encode、curl_init等)、目录写权限(tmp/、config/);
  2. 数据库初始化:执行core/Updates/目录下SQL文件(如4.0.0-b1.sql),创建32张基础表(含log_visit、log_action、site等),并插入默认管理员账号;
  3. 配置生成:将你填写的数据库地址、用户名、密码、表前缀,拼接成config/config.ini.php中的[database]区块。

不做以下事情:
- 不校验MySQL严格模式(STRICT_TRANS_TABLES)是否开启——若未开启,插入超长URL时会静默截断,导致来源页统计失真;
- 不检测PHP opcache是否启用——未启用时,每次请求都要重编译PHP文件,首页加载慢3倍以上;
- 不验证GeoIp2插件是否已下载——即使你勾选了“安装地理定位”,install.php也不会自动fetch MaxMind数据库,需手动执行./console geoip:update

因此,在点击“Next”之前,你必须手动完成三件事:

  1. 登录MySQL,执行:
    sql SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'STRICT_TRANS_TABLES',''));
    (生产环境建议在my.cnf中永久设置sql_mode = “NO_ENGINE_SUBSTITUTION”)

  2. 编辑php.ini,确认以下参数已启用:
    ini opcache.enable=1 opcache.memory_consumption=256 opcache.max_accelerated_files=20000 date.timezone = "Asia/Shanghai"

  3. 进入Matomo根目录,执行:
    bash php console core:update --yes php console geoip:update

注意:php console geoip:update会从MaxMind官网下载GeoLite2-Country.mmdb(约30MB),若服务器无法访问外网,需提前下载该文件,放入misc/geoip/目录,并确保文件权限为644。

2.2 数据库表前缀不是防攻击,而是多站点隔离刚需

安装向导里让你填“表前缀”,很多人习惯填matomo_。但如果你计划用同一套Matomo后台管理多个网站(比如企业官网、招聘站、博客),强烈建议按业务域划分前缀:

  • 官网:web_
  • 招聘站:job_
  • 博客:blog_

为什么?因为Matomo的多站点数据隔离,不是靠数据库用户权限,而是靠表前缀+site.id区分。所有核心SQL查询都带WHERE条件:WHERE idsite = ?。但如果所有表都用matomo_前缀,当你要给招聘站单独开通只读账号时,就必须给matomo_log_visit、matomo_log_action等32张表逐一授权——而用job_前缀,只需授权job_%通配符即可。

更隐蔽的好处在于备份恢复:mysqldump -u root -p your_db job_* > job_backup.sql可精准分离招聘站数据,避免误删官网报表。

2.3 安装完成后必须立即做的五件事

安装向导显示“Congratulations!”只是起点。接下来五分钟内,你必须完成以下操作,否则系统处于半残废状态:

  1. 禁用默认管理员账号
    登录后台 → Settings → Users → 找到“admin”用户 → 点击编辑 → 取消勾选“Super User” → 保存。
    理由:Matomo不支持删除admin账号,但可降权。这是防止暴力破解的第一道防线。

  2. 创建专用数据库用户
    不要用root连接Matomo。执行:
    sql CREATE USER 'matomo_app'@'localhost' IDENTIFIED BY 'StrongPass123!'; GRANT SELECT, INSERT, UPDATE, DELETE ON your_db.web_* TO 'matomo_app'@'localhost'; FLUSH PRIVILEGES;
    然后编辑config/config.ini.php,将[database]下的username/password改为matomo_app的新凭据。

  3. 启用HTTPS追踪
    在Settings → Websites → 编辑你的网站 → 勾选“Force HTTPS for this website”。
    否则,HTTP页面上的_tracker.js会因混合内容被浏览器拦截,导致数据丢失。

  4. 配置自动归档
    Linux下添加crontab:
    bash # 每天凌晨2点执行归档 0 2 * * * /usr/bin/php /var/www/matomo/console core:archive --url=https://your-domain.com/matomo/ >> /var/log/matomo-archive.log 2>&1
    注意:–url参数必须是你对外访问的完整URL(含协议和路径),不能是localhost。

  5. 验证Tracker埋点
    在网站HTML的前插入:
    ```html

```
然后打开浏览器开发者工具→Network标签,过滤matomo.php,刷新页面,应看到200响应且Request Payload包含idsite=1&rec=1。


3. 核心功能实操验证与参数调优

3.1 会话回放(Session Recording)为什么默认不工作?

HeatmapSessionRecording插件是Matomo最惊艳的功能之一,但它默认处于“半休眠”状态。原因有三:

  1. 前端JS未加载录制脚本
    安装向导不会自动在tracker.js中注入录制逻辑。你必须手动修改网站埋点代码,在_paq.push([‘trackPageView’])之后添加:
    javascript _paq.push(['enableJSErrorTracking']); _paq.push(['enableHeartBeatTimer', 15]); // 每15秒上报一次心跳 _paq.push(['enableLinkTracking']);

  2. 后端未开启录制开关
    config/config.ini.php中需显式启用:
    ini [SessionRecording] enable_session_recording = 1 session_recording_sample_rate = 100 ; 百分比采样,100=全量 session_recording_max_duration = 3600 ; 最长录制3600秒(1小时)

  3. MySQL表空间不足
    录制数据存在log_session_recordings表,单条记录平均20KB。若每天1000访客,每人录制5分钟,日增数据约10GB。必须提前规划:
    ``sql -- 查看当前表大小 SELECT table_name ASTable, ROUND(((data_length + index_length) / 1024 / 1024), 2)Size (MB)`
    FROM information_schema.TABLES
    WHERE table_schema = “your_db” AND table_name = “log_session_recordings”;

– 若超过50GB,建议分区
ALTER TABLE log_session_recordings PARTITION BY RANGE (idvisit) (
PARTITION p0 VALUES LESS THAN (1000000),
PARTITION p1 VALUES LESS THAN (2000000),
PARTITION pmax VALUES LESS THAN MAXVALUE
);
```

实测发现:当session_recording_sample_rate设为100且访客数>5000/日时,MySQL IOPS飙升,需将log_session_recordings表迁移到SSD磁盘,并在my.cnf中增加:

innodb_io_capacity = 2000 innodb_io_capacity_max = 4000

3.2 热力图(Heatmap)坐标错位的根源与修复

Heatmap插件默认使用CSS选择器定位元素,但现代前端框架(Vue/React)常动态生成class名(如_n9k3x),导致热力图点击区域漂移。解决方案分三层:

前端层:为关键按钮/链接添加稳定data属性

<!-- 不要这样 --> <button class="btn-primary">立即咨询</button> <!-- 要这样 --> <button class="btn-primary">$left = $action['x'] * $scale;

改为:

$left = round($action['x'] * $scale); // 强制取整,避免小数坐标渲染模糊

实操心得:热力图数据延迟约15分钟(因依赖归档任务)。若刚部署就看不到数据,先执行php console core:archive --force-all-websites手动触发一次。

3.3 漏斗转化分析(Goals)的三个致命陷阱

Goals插件能追踪用户从“进入首页→浏览产品页→填写表单→提交成功”的完整路径,但极易配置失误:

陷阱1:URL匹配模式选错
在Goals设置中,“Match type”有三种:
-Exact URL:必须完全一致(含?参数),适合静态页;
-Contains:子串匹配,但会误伤(如目标页/submit/匹配到/submit-success/);
-Regex:最精准,但需转义特殊字符。

正确做法:对表单提交成功页,用Regex匹配^/submit\-success/\d+$(以/submit-success/开头,后跟数字ID)。

陷阱2:漏斗步骤顺序颠倒
Matomo要求漏斗步骤必须按用户行为顺序排列,且第一步必须是“进入网站”。若你把“填写表单”设为第一步,系统会认为所有访问该页的用户都是漏斗起点,导致转化率虚高。

陷阱3:未启用Goal Ecommerce
若要统计订单金额,必须在Goals设置中勾选“Enable Ecommerce tracking”,并在埋点JS中添加:

_paq.push(['addEcommerceItem', 'SKU123', // SKU 'iPhone 15', // 名称 '手机', // 分类 7999.00, // 单价 1 // 数量 ]); _paq.push(['trackEcommerceOrder', 'ORDER-2024-001', 7999.00]);

否则,Goals报表中只会显示“转化次数”,不显示“收入”。

3.4 用户画像标签(Custom Dimensions)与分群实战

CustomDimensions插件允许你为访客打标签,比如“新用户/老用户”、“企业客户/个人用户”、“高价值/低价值”。但标签维度不是越多越好,关键在可操作性

  • 维度1(访客级别):is_enterprise = 1(根据邮箱域名判断,如@company.com)
  • 维度2(会话级别):traffic_source = "wechat"(从微信内置浏览器UA识别)
  • 维度3(行动级别):form_type = "contact"(表单提交时传参)

配置步骤:
1. Settings → Custom Dimensions → Add New Dimension → 选择“Visitor level”
2. 在埋点JS中添加:
javascript _paq.push(['setCustomDimension', 1, 'enterprise']); // 维度ID从1开始
3. 报表中即可在“Visitors > Overview”右侧筛选器中选择该维度。

注意:Custom Dimensions的值存储在log_visit.custom_dimension_1字段,该字段类型为VARCHAR(255)。若你传入JSON字符串(如{“type”:”vip”,”level”:5}),会因超长被截断。正确做法是拆分为多个维度,或用Hash编码(如md5(“vip:5”))。


4. GDPR合规配置闭环与审计准备

4.1 数据主体权利响应流程(DSAR)实操

GDPR第15条赋予用户“访问权”,即用户可申请导出其在你网站上产生的所有行为数据。Matomo本身不提供一键导出界面,但可通过API+SQL组合实现:

  1. 用户提供邮箱地址(如user@example.com)
  2. 执行SQL查出该用户所有visit_id:
    sql SELECT DISTINCT idvisit FROM log_visit WHERE config_browser_name LIKE '%Chrome%' AND location_country = 'CN' AND visit_last_action_time >= DATE_SUB(NOW(), INTERVAL 2 YEAR);
    注:Matomo不存储邮箱,需结合你网站登录系统关联visit_id

  3. 调用API导出行为明细:
    bash curl "https://your-domain.com/matomo/index.php?module=API&method=Live.getLastVisitsDetails&idSite=1&period=range&date=last30&format=JSON&token_auth=YOUR_TOKEN&filter_limit=10000"

  4. 将结果整理为CSV,包含字段:visit_id、page_url、action_time、event_category、event_action

整个过程应在30天内完成。建议将上述步骤写成Shell脚本,命名为dsar_export.sh,放入cron每日扫描新申请。

4.2 隐私政策(PRIVACY.md)与Matomo配置的映射关系

你压缩包里的PRIVACY.md不是摆设,它必须与config.ini.php配置一一对应。例如:

隐私政策条款对应配置项验证方式
“我们不会将您的数据出售给第三方”[Tracker] record_statistics = 1(必须为1,表示仅本地记录)检查config.ini.php中无record_statistics = 0
“您可随时撤回同意”[Privacy] consent_required = 1+ 前端调用_paq.push(['forgetConsentGiven'])在浏览器控制台执行该命令,再刷新页面,matomo.php应返回403
“我们使用Cookie进行会话管理”[General] use_cookies = 1若设为0,Heatmap Session Recording将失效

提示:PRIVACY.md中提到的“数据保留期限为26个月”,必须与config.ini.php中delete_logs_older_than = 26完全一致,否则构成虚假陈述。

4.3 审计日志(SECURITY.md)与安全加固清单

SECURITY.md列出Matomo的安全实践,但真正要落地,需完成以下加固:

  1. 禁用未使用插件
    编辑config/config.ini.php,清空[Plugins]段落中不需要的插件:
    ini plugins_enabled = "CoreHome,CoreAdminHome,CoreVisualizations,API,Widgetize,Transitions,Actions,Dashboard,MultiSites,Referrers,UserCountry,VisitsSummary,Goals,SEO,Events,UsersManager,PrivacyManager,CoreUpdater,CoreConsole,ScheduledReports,UserLanguage,Heartbeat,Intl,Marketplace,Overlay,SegmentEditor,Transitions,DevicesDetection,Resolution,Contents,PagePerformance,CustomDimensions"
    移除MobileMessaging、Feedback、Login(若用LDAP统一认证)等

  2. 限制API访问IP
    在Nginx配置中添加:
    nginx location /matomo/index.php { allow 192.168.1.0/24; # 内网管理IP段 deny all; try_files $uri $uri/ /index.php?$args; }

  3. 加密备份数据库
    使用gpg加密每日备份:
    bash mysqldump -u matomo_app -p'Pass' your_db | gzip | gpg --encrypt --recipient "admin@your-domain.com" > /backup/matomo-$(date +%F).sql.gz.gpg

  4. 定期更新核心
    每月执行:
    bash php console core:update --yes php console plugin:update --all

  5. 监控异常登录
    创建视图跟踪失败登录:
    sql CREATE VIEW failed_login_attempts AS SELECT ip, COUNT(*) as attempts, MAX(date) as last_attempt FROM log_login_failures WHERE date >= DATE_SUB(NOW(), INTERVAL 1 HOUR) GROUP BY ip HAVING COUNT(*) > 5;


5. 插件生态与二次开发接口详解

5.1 超100个插件的筛选逻辑:什么该装,什么该删?

Matomo插件不是越多越好。我按客户类型总结出三类必装/慎装清单:

政务类站点(强合规需求)
✅ 必装:PrivacyManager、GeoIp2、CustomDimensions、ScheduledReports
❌ 禁用:MobileMessaging(短信通知)、Feedback(用户反馈弹窗)、TagManager(第三方标签管理,违反数据不出域原则)

电商类站点(重转化分析)
✅ 必装:Goals、Ecommerce、A/BTesting、FormAnalytics、PagePerformance
❌ 慎用:HeatmapSessionRecording(需评估存储成本)、CustomVariables(已被CustomDimensions替代)

技术博客(重内容传播)
✅ 必装:SEO、Referrers、SocialAnalytics、Annotations(文章批注)、UsersManager
❌ 禁用:TwoFactorAuth(管理员少,增加复杂度)、Provider(ISP识别,国内无意义)

实操心得:插件启用后,首次访问后台会触发数据库迁移。若中途断电,可能导致表结构损坏。务必在启用前执行php console core:backup-db

5.2 API接口调用的五个黄金实践

Matomo提供RESTful API,但直接调用易踩坑。以下是经过生产验证的最佳实践:

实践1:永远用POST传递token_auth
不要把token写在URL里(?token_auth=xxx),会被Nginx日志、CDN缓存记录。正确方式:

curl -X POST "https://your-domain.com/matomo/index.php" \ --data "module=API" \ --data "method=VisitsSummary.get" \ --data "idSite=1" \ --data "period=day" \ --data "date=yesterday" \ --data "format=JSON" \ --data "token_auth=YOUR_TOKEN"

实践2:批量获取用segment参数
要查“iOS用户昨日访问量”,不用两次请求,而用segment:

--data "segment=visitorDeviceType==mobile;visitorOs==iOS"

实践3:大报表分页取数
filter_limit=10000仍不够,用filter_offset分页:

# 第一页 --data "filter_limit=5000" --data "filter_offset=0" # 第二页 --data "filter_limit=5000" --data "filter_offset=5000"

实践4:缓存API响应
对不实时的报表(如月度汇总),加Cache-Control头:

header('Cache-Control: public, max-age=3600'); // 缓存1小时

实践5:错误处理必须解析error字段
API返回JSON中,即使HTTP状态码200,也可能含错误:

{ "result": "error", "message": "The requested period is not supported." }

务必检查result字段,而非只看HTTP状态。

5.3 白标定制(White Labeling)的三个层次

白标不是简单换Logo,而是贯穿前端、后端、邮件的全链路品牌渗透:

层次1:前端UI替换
- 替换themes/default/images/logo.svg为你的SVG Logo
- 修改themes/default/css/custom.css,覆盖.topbar-logo img样式
- 在config/config.ini.php中设置:
ini [General] custom_logo = "themes/default/images/my-logo.svg" custom_favicon = "themes/default/images/favicon.ico"

层次2:后端邮件模板
编辑plugins/UsersManager/templates/emailPasswordReset.twig,将Matomo字样替换为你的品牌名,并修改发件人邮箱为noreply@your-domain.com

层次3:API响应去品牌化
在plugins/API/API.php中,搜索'Matomo',将其替换为'Your Analytics'。注意:此操作需在每次core:update后重新patch。

提示:白标后,用户仍可在Settings → General Settings中看到“Powered by Matomo”小字。若要彻底移除,需编辑core/View.php,删除<div class="powered-by">区块——但这违反AGPLv3许可证,不建议。


6. 常见问题与排查技巧实录

6.1 安装向导卡在“正在连接数据库”?五步定位法

现象:install.php页面显示“Connecting to the database…”后无响应,超时退出。

排查步骤:

  1. 确认MySQL服务状态
    bash systemctl status mysql # 若显示inactive,启动:systemctl start mysql

  2. 测试PHP能否连MySQL
    创建test_db.php:
    ```php

```
浏览器访问test_db.php,若报错,则问题在PHP或MySQL配置。

  1. 检查MySQL绑定地址
    编辑/etc/mysql/mysql.conf.d/mysqld.cnf,确认:
    ini bind-address = 127.0.0.1 # 若为0.0.0.0,需加防火墙规则:ufw allow from 127.0.0.1 to any port 3306

  2. 验证数据库用户权限
    sql SELECT host, user FROM mysql.user WHERE user = 'root'; -- 若host为'localhost',则PHP用127.0.0.1连接会失败,需创建'127.0.0.1'用户 CREATE USER 'root'@'127.0.0.1' IDENTIFIED BY 'password'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1'; FLUSH PRIVILEGES;

  3. 检查SELinux(CentOS/RHEL)
    bash getenforce # 若为Enforcing,临时关闭:setenforce 0 # 永久关闭:sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

6.2 实时访客数为0?九成是HTTPS混合内容

现象:后台显示“Real-time visitors: 0”,但Network中matomo.php返回200。

根本原因:网站用HTTPS,但埋点JS地址写成HTTP,被浏览器拦截。

验证方法:
浏览器开发者工具 → Console标签,查找:

Mixed Content: The page at 'https://your-domain.com/' was loaded over HTTPS, but requested an insecure script 'http://your-domain.com/matomo/js/matomo.js'. This request has been blocked.

修复方案:
- 将埋点代码中http://your-domain.com/matomo/js/matomo.js改为https://your-domain.com/matomo/js/matomo.js
- 或更稳妥:用协议相对URL//your-domain.com/matomo/js/matomo.js
- 或终极方案:在Nginx中强制跳转:
nginx if ($scheme = http) { return 301 https://$server_name$request_uri; }

6.3 热力图显示“无数据”,但会话回放正常?检查CSS选择器

现象:Heatmap仪表盘显示“0 sessions recorded”,但Session Recording能播放录像。

原因:Heatmap默认只追踪<a><button><input><select>四类元素。若你的CTA按钮是<div onclick="...">,则不会被捕捉。

解决步骤:
1. 在Heatmap设置中,将“CSS selector for heatmap tracking”改为a, button, input, select, [data-heatmap]
2. 为div按钮添加data属性:<div>[database] pdo_options = {"12": "1", "3": "2"}

其中12是PDO::ATTR_PERSISTENT,3是PDO::ATTR_ERRMODE,强制使用持久连接并抛出异常。这个细节,官方文档提都没提,但却是高并发场景的生死线。

Matomo的价值,从来不在功能列表有多炫,而在于它把每一个数据流转环节都暴露给你——从IP如何被匿名化,到热力图坐标如何映射到DOM,再到GDPR删除指令如何翻译成DELETE SQL。你拿到的不是黑盒SaaS,而是一套可审计、可追溯、可定制的数据主权操作系统。只要守住权限、配对配置、盯紧日志,它就能稳稳跑在你自己的服务器上,十年不换。

本文还有配套的精品资源,点击获取

简介:一套开箱即用的Matomo网站流量统计系统PHP源码,适配PHP 5+和MySQL环境,支持本地服务器一键部署。装好就能看实时访客数、热门页面、搜索来源词、用户地域分布、设备类型等基础数据。内置热力图、会话回放、表单行为追踪、A/B测试和漏斗转化分析,还能打用户标签、做画像分群。自带超100个官方插件,提供标准API接口,方便对接内部系统或做定制开发。界面支持白标替换,报表可导出PDF,也能嵌入其他管理平台。全程离线运行,不外传数据,无采样、无上限、不强制上报,满足GDPR、CCPA等隐私法规要求。压缩包里包含完整可执行代码、数据库结构文件、config配置模板、安装引导页以及多语言资源,直接解压就能启动安装流程。


本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/11 13:38:59

生产级机器学习系统:从Notebook到稳定运行的七支柱

1. 项目概述&#xff1a;当模型走出笔记本&#xff0c;真正开始“呼吸”现实世界你有没有经历过这样的时刻&#xff1f;模型在 Jupyter Notebook 里跑得飞起&#xff0c;AUC 0.92&#xff0c;F1 0.88&#xff0c;交叉验证稳如老狗&#xff1b;团队围在白板前击掌庆祝&#xff0…

作者头像 李华
网站建设 2026/6/11 13:38:22

实战解析:如何用VBA读取DXF文件并提取Polyline坐标数据?

实战解析&#xff1a;如何用VBA读取DXF文件并提取Polyline坐标数据&#xff1f;在CAD设计与工程分析领域&#xff0c;DXF文件作为通用的数据交换格式&#xff0c;承载着丰富的几何信息。当我们需要批量处理图纸中的多段线数据时&#xff0c;手动记录坐标点显然效率低下。本文将…

作者头像 李华
网站建设 2026/6/11 13:37:45

实战指南:bitsandbytes CUDA版本兼容性配置与优化

实战指南&#xff1a;bitsandbytes CUDA版本兼容性配置与优化 【免费下载链接】bitsandbytes Accessible large language models via k-bit quantization for PyTorch. 项目地址: https://gitcode.com/gh_mirrors/bi/bitsandbytes bitsandbytes是一个为PyTorch提供k-bit…

作者头像 李华
网站建设 2026/6/11 13:37:45

精度翻倍!ZLinear采集卡ADC两点标定原理与实操指南

zlinear开源电子 如果你手里有一块ZLinear开源电子的数据采集卡&#xff08;DABL-7606/DABL-G511/DABM-D223&#xff09;&#xff0c;你可能会发现一个尴尬的事实&#xff1a;官标精度0.1%或0.02%&#xff0c;但实际用起来总觉得“差那么一点”。 其实这并非卡有问题&#xf…

作者头像 李华
网站建设 2026/6/11 13:36:34

生成式AI简历筛选系统:DataRobot+Bedrock端到端实战

1. 项目概述&#xff1a;一场48小时极限挑战下的AI招聘助手实战去年秋天&#xff0c;我和团队在DataRobot与AWS联合举办的黑客松现场&#xff0c;盯着倒计时屏幕上的“02:17:43”发呆——距离提交截止只剩不到三小时&#xff0c;而我们的CV筛选器还在把一份Java工程师的简历&am…

作者头像 李华
网站建设 2026/6/11 13:36:18

百度网盘秒传革命:3分钟掌握永久分享的核心技术

百度网盘秒传革命&#xff1a;3分钟掌握永久分享的核心技术 【免费下载链接】rapid-upload-userscript-doc 秒传链接提取脚本 - 文档&教程 项目地址: https://gitcode.com/gh_mirrors/ra/rapid-upload-userscript-doc 秒传链接提取脚本重新定义了文件分享方式&#…

作者头像 李华