php实现消息
PHP实现消息功能的方法
数据库设计
创建消息表存储消息数据,基本字段包括:
id:消息唯一标识sender_id:发送者IDreceiver_id:接收者IDcontent:消息内容created_at:发送时间status:消息状态(已读/未读)
CREATE TABLE messages (
id INT AUTO_INCREMENT PRIMARY KEY,
sender_id INT NOT NULL,
receiver_id INT NOT NULL,
content TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
status TINYINT DEFAULT 0 COMMENT '0未读 1已读'
);
发送消息功能
使用PHP处理表单提交并将消息存入数据库:
<?php
// 连接数据库
$db = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$senderId = $_POST['sender_id'];
$receiverId = $_POST['receiver_id'];
$content = htmlspecialchars($_POST['content']);
$stmt = $db->prepare("INSERT INTO messages (sender_id, receiver_id, content) VALUES (?, ?, ?)");
$stmt->execute([$senderId, $receiverId, $content]);
echo "消息发送成功";
}
?>
接收消息功能
查询特定用户的未读消息:
<?php
$userId = $_GET['user_id']; // 当前用户ID
$stmt = $db->prepare("SELECT * FROM messages WHERE receiver_id = ? AND status = 0 ORDER BY created_at DESC");
$stmt->execute([$userId]);
$messages = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($messages as $message) {
echo "<div class='message'>";
echo "<p>" . htmlspecialchars($message['content']) . "</p>";
echo "<small>" . $message['created_at'] . "</small>";
echo "</div>";
// 标记为已读
$update = $db->prepare("UPDATE messages SET status = 1 WHERE id = ?");
$update->execute([$message['id']]);
}
?>
实时消息推送
使用WebSocket或长轮询实现实时消息通知:
// 长轮询示例
while (true) {
$stmt = $db->prepare("SELECT COUNT(*) FROM messages WHERE receiver_id = ? AND status = 0");
$stmt->execute([$userId]);
$count = $stmt->fetchColumn();
if ($count > 0) {
echo json_encode(['has_new' => true]);
break;
}
sleep(1); // 每秒检查一次
}
消息队列处理
对于高并发场景,可以使用Redis队列:
// 发送消息时存入Redis队列
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->rPush('message_queue', json_encode([
'sender_id' => $senderId,
'receiver_id' => $receiverId,
'content' => $content
]));
安全性考虑
- 使用预处理语句防止SQL注入
- 对输出内容使用htmlspecialchars()过滤
- 验证用户身份和权限
- 敏感内容加密存储







