我正在使用Api平台为我的网站开发一个PHP REST api,用户可以发布'评论'(类似于文章)。我想跟踪这篇文章的独特页面浏览量,以便我可以在以后查看最常见的评论并显示它们。
我已经在线阅读了很多解决方案,我已经实施了两个解决方案:Google Analytics跟踪和Redis +浏览器指纹识别。
首先,Google Analytics跟踪效果非常好,我使用'ga:uniquePageviews'属性,并在页面路径中使用过滤器来获取使用Google PHP Api的唯一网页浏览量。此方法的唯一问题是某些用户使用广告拦截器并阻止Google Analytics,因此不会为这些人记录任何网页浏览量。
我还使用Redis +浏览器指纹识别(使用fingerprintjs2)为匿名用户实现了视图跟踪,并使用用户ID登录用户。因此,对于登录用户,如果他们在过去30分钟内未访问过该页面,则会添加一个新的唯一视图。这看起来效果很好。 问题出在匿名用户身上。目前,在网站方面,我使用fingerprintjs2库生成浏览器指纹,然后将其传递到标头中的REST api,如果该指纹在过去30分钟内未访问该页面,则会添加新的唯一视图。但是因为我的REST api将会公开(我计划将来也可能制作一个移动应用程序),任何人都可以在指纹头中放入任何想要的东西,只需不断更改它,就会记录一个新的独特视图,我不知道如何解决这个问题。只允许来自我的网站域的CORS修复此问题吗?但那么移动应用程序呢?
现在我倾向于认为使用谷歌分析是最好的方式,尽管广告拦截,但Redis方法对我来说似乎很酷,我也想让它工作。
以下是我目前用于Redis的代码示例:
public function addAndGetReviewViews(Request $request, $id)
{
$viewsKey = 'pageviews-review-' . $id;
$setKey = 'uniqueviews-review-' . $id;
$user = $this->getUser();
if ($user) {
$userId = $user->getId();
} else if ($request->headers->has('X-Anonymous-Fingerprint')) {
$userId = base64_encode(
substr($request->headers->get('X-Anonymous-Fingerprint'), 0, 32)
);
} else {
// Only add views if user is logged in or has anonymous fingerprint
return $this->redis->get($viewsKey) ?: 0;
}
$setExists = $this->redis->exists($setKey);
if (!$this->redis->sismember($setKey, $userId)) {
$this->redis->sadd($setKey, $userId);
$this->redis->incr($viewsKey);
}
if (!$setExists) {
$this->redis->expire($setKey, 1800);
}
return $this->redis->get($viewsKey);
}