php 关注实现
PHP 实现关注功能
关注功能是社交网络或内容平台的核心功能之一,通常涉及用户之间的关联关系。以下是实现关注功能的常见方法:
数据库设计 创建用户表和关注关系表,用户表存储用户基本信息,关注关系表记录用户之间的关注关系。
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL
);
CREATE TABLE follows (
follower_id INT NOT NULL,
following_id INT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (follower_id, following_id),
FOREIGN KEY (follower_id) REFERENCES users(id),
FOREIGN KEY (following_id) REFERENCES users(id)
);
关注操作 处理用户发起关注请求的逻辑,检查是否已关注,避免重复关注。
function followUser($followerId, $followingId) {
// 检查是否已关注
$stmt = $pdo->prepare("SELECT 1 FROM follows WHERE follower_id = ? AND following_id = ?");
$stmt->execute([$followerId, $followingId]);
if ($stmt->fetch()) {
return false; // 已关注
}
// 添加关注关系
$stmt = $pdo->prepare("INSERT INTO follows (follower_id, following_id) VALUES (?, ?)");
return $stmt->execute([$followerId, $followingId]);
}
取消关注 处理用户取消关注的逻辑,从关注关系表中删除对应记录。
function unfollowUser($followerId, $followingId) {
$stmt = $pdo->prepare("DELETE FROM follows WHERE follower_id = ? AND following_id = ?");
return $stmt->execute([$followerId, $followingId]);
}
获取关注列表 查询用户关注的其他用户列表。
function getFollowingList($userId) {
$stmt = $pdo->prepare("
SELECT u.id, u.username
FROM follows f
JOIN users u ON f.following_id = u.id
WHERE f.follower_id = ?
");
$stmt->execute([$userId]);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
获取粉丝列表 查询关注该用户的粉丝列表。
function getFollowerList($userId) {
$stmt = $pdo->prepare("
SELECT u.id, u.username
FROM follows f
JOIN users u ON f.follower_id = u.id
WHERE f.following_id = ?
");
$stmt->execute([$userId]);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
检查关注状态 判断当前用户是否已关注目标用户。
function isFollowing($followerId, $followingId) {
$stmt = $pdo->prepare("SELECT 1 FROM follows WHERE follower_id = ? AND following_id = ?");
$stmt->execute([$followerId, $followingId]);
return (bool)$stmt->fetch();
}
性能优化建议
对于大型社交平台,关注功能可能需要考虑以下优化措施:
分页查询 关注列表和粉丝列表实现分页查询,避免一次性加载大量数据。
function getFollowingListPaginated($userId, $page = 1, $perPage = 10) {
$offset = ($page - 1) * $perPage;
$stmt = $pdo->prepare("
SELECT u.id, u.username
FROM follows f
JOIN users u ON f.following_id = u.id
WHERE f.follower_id = ?
LIMIT ? OFFSET ?
");
$stmt->execute([$userId, $perPage, $offset]);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
缓存机制 对关注关系和数量进行缓存,减少数据库查询压力。
异步处理 将关注操作放入消息队列异步处理,提高响应速度。
数据库索引优化 确保关注关系表的查询字段都有适当索引。







