
本文介绍如何通过 php 循环调用 matomo 多个 api 方法(如设备、国家、语言等),统一获取并安全渲染 json 响应数据,避免硬编码单次请求,提升可维护性与扩展性。
本文介绍如何通过 php 循环调用 matomo 多个 api 方法(如设备、国家、语言等),统一获取并安全渲染 json 响应数据,避免硬编码单次请求,提升可维护性与扩展性。
在实际开发中,若需从 Matomo(原 Piwik)API 批量获取多类分析指标(如访问设备、用户国家、语言、访客频次等),不应为每个指标单独编写一次 HTTP 请求——这会导致代码冗余、难以维护。理想方案是将所有指标方法名集中管理,并通过循环动态构造请求 URL,逐个调用并解析响应。
✅ 正确结构:分离配置与逻辑
首先,精简 TabMetrique.php,仅定义指标数组,移除无意义的 getMetrique() 函数(它固定返回第 10 项,违背“显示全部”的初衷):
<?php // TabMetrique.php
$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 基础参数(period、date、format、token_auth 等),再对 $metrique 数组遍历,拼接 method 参数发起请求:
<?php include 'TabMetrique.php';
$token_auth = 'your_secure_token_here'; // ⚠️ 务必替换为真实 token,切勿硬编码在生产环境
$base_url = "http://localhost/matomo/?module=API&format=JSON&token_auth={$token_auth}&idSite=1&period=month&date=2022-05-14";
foreach ($metrique as $metric) {
$url = $base_url . "&method=" . urlencode($metric);
// 使用 file_get_contents 发起请求(生产环境建议改用 cURL,支持超时/错误重试)
$response = file_get_contents($url);
if ($response === false) {
echo "<p><strong>❌ 请求失败:</strong>无法连接到 Matomo API(方法:{$metric})";
continue;
}
$data = json_decode($response, true);
// 检查 JSON 解析是否成功且非空
if (json_last_error() !== JSON_ERROR_NONE || !is_array($data) || empty($data)) {
echo "<p><strong>⚠️ 数据异常:</strong>API 返回空或无效 JSON(方法:{$metric})</p>";
continue;
}
// 输出标题(区分不同指标)
echo "<h2>? {$metric}</h2>\n";
// 根据 Matomo API 响应结构灵活处理(常见格式:数组 of objects 或关联数组)
if (isset($data['result']) && $data['result'] === 'error') {
echo "<p><strong>❌ API 错误:</strong>{$data['message']}</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" 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 rel="nofollow" href="/xiazai/skill2138" title="PHP" class="overflowclass">PHP</a>
<p class="overflowclass">编写健壮的PHP代码,规避类型转换陷阱、数组怪癖及常见安全漏洞。</p>
</div>
<a rel="nofollow" href="/xiazai/skill2138" title="PHP" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div>";
continue;
}
// 示例:兼容多种响应结构(如 getVisits 返回数字,getCountry 返回对象数组)
if (is_numeric($data)) {
echo "<p><strong>数值结果:</strong>{$data}</p>";
} elseif (is_array($data) && !empty($data)) {
foreach ($data as $item) {
if (is_array($item) && isset($item['label'], $item['nb_visits'])) {
$label = htmlspecialchars($item['label'] ?? 'N/A', ENT_QUOTES, 'UTF-8');
$visits = $item['nb_visits'] ?? 0;
echo "<p><strong>{$label}</strong> — {$visits} 次访问</p>";
} elseif (is_string($item)) {
echo "<p>{$item}</p>";
}
}
} else {
echo "<pre class="brush:php;toolbar:false;">" . htmlspecialchars(print_r($data, true), ENT_QUOTES, 'UTF-8') . "";
}
}
?>⚠️ 关键注意事项
-
安全性:
token_auth必须严格保密,生产环境应从环境变量或配置文件加载,禁止明文提交至版本控制。 -
错误处理:
file_get_contents()可能因网络、权限或 API 限流失败,需检查返回值false并提供友好提示。 -
JSON 验证:使用
json_last_error()确保响应可解析,避免null导致后续逻辑崩溃。 - 性能优化:高频调用建议启用 Matomo 的 Bulk Request 功能,单次请求获取多个指标,减少 HTTP 开销。
-
XSS 防护:所有输出到 HTML 的变量必须经
htmlspecialchars()过滤,防止脚本注入。
通过此结构化方案,您不仅能一次性展示全部 Matomo 指标,还能轻松增删指标、统一错误处理、保障输出安全,为后续集成仪表盘或数据导出奠定坚实基础。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










