PHP防重推荐实现
PHP防重推荐实现
防重推荐系统通常用于避免重复推荐相同内容,提升用户体验。以下是几种常见的实现方法:
基于Cookie或Session存储
利用Cookie或Session存储用户已浏览或推荐过的内容ID,每次推荐前检查是否已存在。

session_start();
$recommendedItems = $_SESSION['recommended_items'] ?? [];
function isRecommended($itemId, &$recommendedItems) {
if (in_array($itemId, $recommendedItems)) {
return true;
}
array_push($recommendedItems, $itemId);
$_SESSION['recommended_items'] = $recommendedItems;
return false;
}
数据库记录用户行为
在数据库中创建用户行为表,记录用户与内容的交互记录,推荐时通过查询排除已交互内容。
CREATE TABLE user_behavior (
user_id INT,
item_id INT,
behavior_type ENUM('view', 'click', 'purchase'),
created_at TIMESTAMP
);
function getUnseenItems($userId, $limit = 10) {
$query = "SELECT items.* FROM items
LEFT JOIN user_behavior ON items.id = user_behavior.item_id
AND user_behavior.user_id = ?
WHERE user_behavior.item_id IS NULL
LIMIT ?";
$stmt = $pdo->prepare($query);
$stmt->execute([$userId, $limit]);
return $stmt->fetchAll();
}
使用Redis实现高效去重
利用Redis的集合数据结构存储用户已推荐内容,利用其高性能特性。

$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
function recommendItems($userId, $itemIds) {
global $redis;
$key = "user:{$userId}:recommended";
$unseenItems = [];
foreach ($itemIds as $itemId) {
if (!$redis->sIsMember($key, $itemId)) {
$unseenItems[] = $itemId;
$redis->sAdd($key, $itemId);
}
}
return $unseenItems;
}
混合内容策略
结合用户历史行为和内容相似度,使用协同过滤或内容相似度算法生成差异化推荐。
function hybridRecommendation($userId) {
$collaborativeItems = getCollaborativeFilteringItems($userId);
$contentBasedItems = getContentBasedItems($userId);
$merged = array_merge($collaborativeItems, $contentBasedItems);
$uniqueItems = array_unique($merged);
return array_slice($uniqueItems, 0, 10);
}
时间衰减因子
为推荐记录添加时间衰减因子,较早的记录权重降低,使得旧内容有机会重新被推荐。
function getTimeWeightedItems($userId) {
$query = "SELECT item_id,
TIMESTAMPDIFF(HOUR, created_at, NOW()) AS hours_passed
FROM user_behavior
WHERE user_id = ?";
$stmt = $pdo->prepare($query);
$stmt->execute([$userId]);
$seenItems = $stmt->fetchAll(PDO::FETCH_ASSOC);
$weightedItems = [];
foreach ($seenItems as $item) {
$weight = max(0.1, 1 - ($item['hours_passed'] / 72));
$weightedItems[$item['item_id']] = $weight;
}
return $weightedItems;
}
以上方法可根据实际业务需求组合使用,Cookie/Session适合简单场景,数据库方案适合需要持久化的场景,Redis适合高性能要求,混合策略能提供更智能的推荐。






