
本文介绍如何通过 php 循环调用 matomo 多个 api 方法,自动获取并结构化显示设备、地域、用户语言、访问频次等全部 11 类指标数据,避免手动逐个请求。
本文介绍如何通过 php 循环调用 matomo 多个 api 方法,自动获取并结构化显示设备、地域、用户语言、访问频次等全部 11 类指标数据,避免手动逐个请求。
要高效、可维护地展示 Matomo 的全部指标数据(如设备型号、国家、城市、用户语言、回访率等),关键在于将 API 方法列表抽象为数组,并用 foreach 统一发起请求与解析响应,而非硬编码单个接口或依赖冗余函数。
首先,精简并重构 TabMetrique.php:移除无必要的 getMetrique() 函数,仅保留清晰注释的指标方法数组:
<?php
// TabMetrique.php —— 存储所有需调用的 Matomo API 方法名
$metrique = [
'DevicesDetection.getModel', // 设备型号
'UserCountry.getCountry', // 国家
'UserCountry.getContinent', // 大洲
'UserCountry.getRegion', // 地区
'UserCountry.getCity', // 城市
'UserId.getUsers', // 用户 ID 列表
'UserLanguage.getLanguage', // 浏览器语言
'VisitFrequency.get', // 访问频次分布(新/回访)
'VisitsSummary.get', // 综合访问摘要(含跳出率、平均时长等)
'VisitsSummary.getVisits', // 总访问次数
'VisitsSummary.getUniqueVisitors' // 独立访客数
];主逻辑文件中,构建基础 URL 模板,再对每个 $metric 动态拼接 &method= 参数,实现批量调用:
<?php
include 'TabMetrique.php';
$token_auth = 'YOUR_TOKEN_HERE'; // ⚠️ 生产环境请使用环境变量或配置文件管理
$base_url = "http://localhost/matomo/?module=API&format=JSON&period=month&date=2022-05-14&idSite=1&token_auth={$token_auth}";
echo "<h1>Matomo 指标数据汇总</h1>\n";
foreach ($metrique as $index => $metric) {
$url = $base_url . "&method=" . urlencode($metric);
// 添加错误处理与超时控制(推荐升级为 cURL)
$json = @file_get_contents($url);
if ($json === false) {
echo "<p><strong>[Error]</strong> 请求失败:{$metric}</p><div class="aritcle_card flexRow">
<div class="artcardd flexRow">
<a class="aritcle_card_img" href="/xiazai/skill2138" title="PHP"><img
src="https://img.php.cn/upload/skill/000/000/081/178884013267959.jpg" alt="PHP" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a href="/xiazai/skill2138" title="PHP">PHP</a>
<p>编写健壮的PHP代码,规避类型转换陷阱、数组怪癖及常见安全漏洞。</p>
</div>
<a href="/xiazai/skill2138" title="PHP" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
</div>
</div><p><span>立即学习</span>“<a href="https://pan.quark.cn/s/7fc7563c4182" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">PHP免费学习笔记(深入)</a>”;</p>\n";
continue;
}
$data = json_decode($json, true);
// 检查 API 是否返回有效数据(Matomo 成功响应通常为数组或对象,空响应可能为 null 或 [])
if (empty($data) || json_last_error() !== JSON_ERROR_NONE) {
echo "<p><strong>[No Data]</strong> {$metric} 未返回有效结果</p>\n";
continue;
}
// 根据不同 API 的响应结构动态渲染(示例:通用标签+数值展示)
echo "<h2>▸ {$metric}</h2>\n<ul>\n";
if (is_array($data) && isset($data['value'])) {
// 如 VisitsSummary.getVisits 返回 { "value": 1234 }
echo "<li><strong>值:</strong>" . htmlspecialchars((string)$data['value'], ENT_QUOTES, 'UTF-8') . "</li>\n";
} elseif (is_array($data) && !empty($data)) {
// 如 UserCountry.getCountry 返回 [ {"label":"France","nb_visits":87}, ... ]
foreach ($data as $item) {
$label = $item['label'] ?? 'N/A';
$visits = $item['nb_visits'] ?? $item['nb_users'] ?? '0';
echo "<li><strong>" . htmlspecialchars($label, ENT_QUOTES, 'UTF-8') .
"</strong> — " . htmlspecialchars((string)$visits, ENT_QUOTES, 'UTF-8') . " 次</li>\n";
}
} else {
// 原始 JSON 字符串(调试用)
echo "<li><code>" . htmlspecialchars(substr(json_encode($data), 0, 100), ENT_QUOTES, 'UTF-8') . "...</code></li>\n";
}
echo "</ul>\n";
}✅ 关键优化点说明:
-
安全转义:所有输出均使用
htmlspecialchars()防止 XSS; -
健壮性增强:
@file_get_contents抑制警告,配合empty()和json_last_error()双重校验; -
结构适配:Matomo 不同 API 返回格式差异大(扁平数组 / 嵌套对象 / 单值),代码通过
isset($data['value'])和is_array($data)分支处理; -
可扩展性:新增指标只需在
$metrique数组末尾追加方法名,无需修改主逻辑; -
生产建议:实际部署时应替换
file_get_contents为带超时、重试机制的cURL,并启用 HTTPS 与令牌轮换。
最终效果是——一次页面加载,自动拉取全部 11 个维度的数据,并按语义分组清晰呈现,大幅提升开发效率与维护性。


















