如何设置PHP网站内容推荐算法:基于行为的推荐策略配置方法
在PHP网站运营过程中,精准的内容推荐能够有效提升用户留存率和内容点击率。基于用户行为的推荐策略,核心是通过收集用户的浏览、点击、收藏等行为数据,分析用户的兴趣偏好,进而为用户推送符合其兴趣的内容。本文将详细介绍如何在PHP网站中配置基于行为的推荐算法,包含完整的实现思路和代码示例。
一、核心实现思路
基于行为的推荐策略整体分为三个核心环节:行为数据收集、用户兴趣建模、推荐内容匹配。首先是收集用户在网站内的各类行为数据,比如浏览记录、点击记录、停留时长等;接着对这些数据进行统计分析,生成每个用户的兴趣标签权重;最后根据用户兴趣标签,匹配对应的内容库,筛选出推荐内容返回给用户。
二、数据库表结构设计
实现该推荐策略需要先设计合理的数据库表,以下是核心表的结构,都使用MySQL作为存储数据库:
| 表名 | 作用 | 核心字段 |
|---|---|---|
| user_behavior | 存储用户行为数据 | id(自增ID)、user_id(用户ID)、content_id(内容ID)、behavior_type(行为类型:1浏览、2点击、3收藏、4分享)、stay_time(停留时长,单位秒)、create_time(行为发生时间) |
| content_info | 存储网站内容基础信息 | id(内容ID)、title(内容标题)、tags(内容标签,多个标签用逗号分隔)、category_id(内容分类ID)、create_time(内容发布时间) |
| user_interest | 存储用户兴趣权重数据 | id(自增ID)、user_id(用户ID)、tag(兴趣标签)、weight(标签权重)、update_time(权重更新时间) |
三、核心功能代码实现
1. 用户行为数据收集
当用户访问网站内容时,需要触发行为记录逻辑,以下是PHP实现的行为记录代码示例,假设使用PDO连接数据库:
<?php
// 数据库连接配置
$dbHost = '127.0.0.1';
$dbName = 'content_recommend';
$dbUser = 'root';
$dbPass = '123456';
$dbCharset = 'utf8mb4';
try {
$pdo = new PDO(
"mysql:host={$dbHost};dbname={$dbName};charset={$dbCharset}",
$dbUser,
$dbPass,
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
);
} catch (PDOException $e) {
die("数据库连接失败:" . $e->getMessage());
}
/**
* 记录用户行为
* @param int $userId 用户ID,未登录用户可传0
* @param int $contentId 内容ID
* @param int $behaviorType 行为类型:1浏览 2点击 3收藏 4分享
* @param int $stayTime 停留时长,单位秒,仅浏览时有效
* @return bool
*/
function recordUserBehavior($userId, $contentId, $behaviorType, $stayTime = 0) {
global $pdo;
// 未登录用户使用设备标识作为临时ID,这里假设通过cookie获取临时标识
if ($userId <= 0) {
$userId = $_COOKIE['tmp_user_id'] ?? 0;
if ($userId == 0) {
$userId = md5(uniqid() . time());
setcookie('tmp_user_id', $userId, time() + 86400 * 30);
}
}
$sql = "INSERT INTO user_behavior (user_id, content_id, behavior_type, stay_time, create_time)
VALUES (:user_id, :content_id, :behavior_type, :stay_time, :create_time)";
$stmt = $pdo->prepare($sql);
return $stmt->execute([
':user_id' => $userId,
':content_id' => $contentId,
':behavior_type' => $behaviorType,
':stay_time' => $stayTime,
':create_time' => date('Y-m-d H:i:s')
]);
}
// 示例:用户点击ID为12的内容,记录行为
$contentId = 12;
$userId = $_SESSION['user_id'] ?? 0;
recordUserBehavior($userId, $contentId, 2);
?>2. 用户兴趣权重计算
定期或者用户行为触发时,更新用户的兴趣标签权重,不同行为类型对应不同的权重加成,停留时长也会额外增加权重:
<?php
/**
* 更新用户兴趣权重
* @param int $userId 用户ID
* @return bool
*/
function updateUserInterest($userId) {
global $pdo;
// 行为类型对应的基础权重
$behaviorWeightMap = [
1 => 1, // 浏览
2 => 3, // 点击
3 => 5, // 收藏
4 => 8 // 分享
];
// 查询用户最近30天的行为数据
$sql = "SELECT b.content_id, b.behavior_type, b.stay_time, c.tags
FROM user_behavior b
LEFT JOIN content_info c ON b.content_id = c.id
WHERE b.user_id = :user_id AND b.create_time >= DATE_SUB(NOW(), INTERVAL 30 DAY)";
$stmt = $pdo->prepare($sql);
$stmt->execute([':user_id' => $userId]);
$behaviorList = $stmt->fetchAll(PDO::FETCH_ASSOC);
if (empty($behaviorList)) {
return true;
}
$tagWeight = [];
foreach ($behaviorList as $behavior) {
if (empty($behavior['tags'])) {
continue;
}
$tags = explode(',', $behavior['tags']);
$baseWeight = $behaviorWeightMap[$behavior['behavior_type']] ?? 1;
// 停留超过60秒额外加2权重
$stayExtra = $behavior['stay_time'] > 60 ? 2 : 0;
$totalWeight = $baseWeight + $stayExtra;
foreach ($tags as $tag) {
$tag = trim($tag);
if (empty($tag)) {
continue;
}
$tagWeight[$tag] = ($tagWeight[$tag] ?? 0) + $totalWeight;
}
}
// 先删除用户旧的权重数据
$delSql = "DELETE FROM user_interest WHERE user_id = :user_id";
$delStmt = $pdo->prepare($delSql);
$delStmt->execute([':user_id' => $userId]);
// 插入新的权重数据
$insertSql = "INSERT INTO user_interest (user_id, tag, weight, update_time) VALUES (:user_id, :tag, :weight, :update_time)";
$insertStmt = $pdo->prepare($insertSql);
$now = date('Y-m-d H:i:s');
foreach ($tagWeight as $tag => $weight) {
$insertStmt->execute([
':user_id' => $userId,
':tag' => $tag,
':weight' => $weight,
':update_time' => $now
]);
}
return true;
}
?>3. 推荐内容匹配生成
根据用户兴趣标签权重,匹配内容库中对应标签的内容,结合内容发布时间、权重排序生成推荐列表:
<?php
/**
* 生成用户推荐内容列表
* @param int $userId 用户ID
* @param int $limit 推荐内容数量,默认10条
* @return array 推荐内容列表
*/
function generateRecommendList($userId, $limit = 10) {
global $pdo;
// 获取用户兴趣标签,按权重降序排列
$interestSql = "SELECT tag, weight FROM user_interest WHERE user_id = :user_id ORDER BY weight DESC LIMIT 10";
$interestStmt = $pdo->prepare($interestSql);
$interestStmt->execute([':user_id' => $userId]);
$interestList = $interestStmt->fetchAll(PDO::FETCH_ASSOC);
if (empty($interestList)) {
// 无兴趣数据时返回热门内容
$hotSql = "SELECT id, title, tags FROM content_info ORDER BY create_time DESC LIMIT :limit";
$hotStmt = $pdo->prepare($hotSql);
$hotStmt->bindValue(':limit', $limit, PDO::PARAM_INT);
$hotStmt->execute();
return $hotStmt->fetchAll(PDO::FETCH_ASSOC);
}
// 拼接标签匹配条件,内容标签包含任意用户兴趣标签即可
$tagConditions = [];
$params = [];
foreach ($interestList as $index => $interest) {
$key = ":tag{$index}";
$tagConditions[] = "FIND_IN_SET(:tag{$index}, REPLACE(tags, ' ', '')) > 0";
$params[$key] = $interest['tag'];
}
$tagWhere = implode(' OR ', $tagConditions);
// 查询匹配的内容,按内容发布时间降序、匹配到的标签权重和降序排序
$contentSql = "SELECT c.id, c.title, c.tags,
(SELECT SUM(i.weight) FROM user_interest i
WHERE i.user_id = :user_id AND FIND_IN_SET(i.tag, REPLACE(c.tags, ' ', '')) > 0) as match_weight
FROM content_info c
WHERE {$tagWhere}
ORDER BY match_weight DESC, c.create_time DESC
LIMIT :limit";
$contentStmt = $pdo->prepare($contentSql);
// 绑定用户ID参数
$contentStmt->bindValue(':user_id', $userId, PDO::PARAM_STR);
// 绑定标签参数
foreach ($params as $key => $val) {
$contentStmt->bindValue($key, $val, PDO::PARAM_STR);
}
$contentStmt->bindValue(':limit', $limit, PDO::PARAM_INT);
$contentStmt->execute();
return $contentStmt->fetchAll(PDO::FETCH_ASSOC);
}
// 示例:获取当前用户的10条推荐内容
$userId = $_SESSION['user_id'] ?? $_COOKIE['tmp_user_id'] ?? 0;
updateUserInterest($userId); // 先更新用户兴趣权重
$recommendList = generateRecommendList($userId, 10);
// 输出推荐内容
foreach ($recommendList as $item) {
echo "<p>推荐内容:{$item['title']}(标签:{$item['tags']})</p>";
}
?>四、策略优化建议
上述基础实现可以根据实际业务场景做进一步优化:
- 行为数据收集可以加入防刷机制,比如同一用户短时间内多次相同行为只记录一次,避免异常数据影响权重准确性。
- 兴趣权重可以加入时间衰减逻辑,最近7天的行为权重更高,30天前的权重逐步降低,更符合用户兴趣变化规律。
- 推荐内容可以做去重处理,避免用户已经浏览过的内容重复出现在推荐列表中。
- 对于新用户没有行为数据时,可以基于内容的热度、分类做冷启动推荐,比如推荐网站近期热门内容。
五、注意事项
配置基于行为的推荐策略时,需要注意用户隐私保护,行为数据的收集需要明确告知用户,并且提供数据删除的入口。同时数据库查询部分需要注意性能优化,用户行为表和内容表可以根据用户ID、内容ID建立索引,避免数据量增长后查询效率下降。如果网站内容量较大,推荐计算可以放到异步任务中执行,避免影响用户访问的正常响应速度。